将Java App连接到WCF Web服务时出错

时间:2010-12-15 14:42:49

标签: c# java wcf eclipse java-metro-framework

我在Eclipse中编写了一个简单的Java控制台应用程序,它引用了用C#编写的WCF Web服务。在我的PC上本地托管WCF服务,我无法使用Java客户端连接到该服务。

我为创建WCF服务所采取的步骤如下

  1. 使用以下端点创建“Service1.svc”:

    string IService1.Hello(string sName) {  返回“Hello”+ sName +“!” ;  }

  2. 该服务的网络配置如下:

      <system.web>
        <compilation debug="true" targetFramework="4.0" />
      </system.web>
      <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="BasicHttpBinding" />
          </basicHttpBinding>
        </bindings>
        <client>
          <endpoint binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding"
            contract="WcfService1.IService1" name="BasicHttpEndpoint" />
        </client>
        <behaviors>
          <serviceBehaviors>
            <behavior>
              <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
              <serviceMetadata httpGetEnabled="true"/>
              <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
              <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
      </system.serviceModel>
     <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
    


     

  3. 我修改了属性,因此服务将始终使用端口8888.

  4. 我使用C#控制台应用程序测试了该服务。

  5. 要创建Java客户端,我执行了以下操作:

    1. 下载并安装与Metro(Web服务器)捆绑在一起的Glassfish 3.0.1(应用程序服务器)

    2. 使用我的jdk的'bin目录'中的'wsimport'工具生成java客户端应用程序的服务引用代码。我运行的.bat文件来创建服务引用

    3. 将上面步骤2中的代码复制到Eclipse中的新Java应用程序中。

    4. 在我的控制台应用程序中创建一个新的Java类,它按如下方式调用Web服务

    5. `

      import java.net.MalformedURLException;
      
      import java.net.URL;
      
      import javax.xml.namespace.QName;
      
      import javax.xml.ws.BindingProvider;
      
      import org.tempuri.Service1;
      
      import org.tempuri.IService1;
      
      
      public class Main {
      
      /**
       * @param args
       */
      public static void main(String[] args) {
      
          try {
              Service1 service = new Service1(new URL("http://localhost:8888/Service1.svc?wsdl"), new QName("http://tempuri.org", "Service1"));
              IService1 port = service.getBasicHttpBindingIService1();
              ((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8888/Service1.svc");
              String sFileName = port.hello("Cal");
      
              System.out.println(sFileName);      
      
      
          } catch (MalformedURLException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
      
              e.printStackTrace();
          }
      }
      }
      

      `

      我尝试运行应用程序时遇到的错误如下:

      Exception in thread "main" javax.xml.ws.WebServiceException: {http://tempuri.org}Service1 is not a valid service. Valid services are: {http://tempuri.org/}Service1
          at com.sun.xml.ws.client.WSServiceDelegate.(WSServiceDelegate.java:237)
          at com.sun.xml.ws.client.WSServiceDelegate.(WSServiceDelegate.java:182)
          at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:106)
          at javax.xml.ws.Service.(Unknown Source)
          at org.tempuri.Service1.(Service1.java:42)
          at Main.main(Main.java:17)
       

      对此有任何帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:1)

变化:

new QName("http://tempuri.org", "Service1")

为:

new QName("http://tempuri.org/", "Service1")

在组织之后注意额外的“/”。