【问题标题】:Error connecting Java App to WCF web service将 Java 应用程序连接到 WCF Web 服务时出错
【发布时间】:2010-12-15 14:42:48
【问题描述】:

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

我创建 WCF 服务的步骤如下

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

    字符串 IService1.Hello(字符串 sName) { 返回“你好”+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# 控制台应用程序测试了该服务。

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

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

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

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

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

`

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)
 

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

【问题讨论】:

  • 是否只是一个在命名空间定义后有 / 而另一个没有?尝试在 Java 客户端 QName 中添加 /。

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


【解决方案1】:

改变:

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

到:

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

请注意 org 后面的额外“/”。

【讨论】:

    猜你喜欢
    • 2014-10-28
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    • 1970-01-01
    相关资源
    最近更新 更多