由于标题指示我有一个Windows服务托管的WCF服务。当我使用Visual Studio WCFTestClient时,它的GetVersion()方法(它只是返回一个字符串)工作正常。当我尝试从Java客户端调用相同的方法时,我得到一个无效的主机名错误。Windows托管的WCF服务返回400错误的请求无效的主机名到JAVA客户端
使用Wireshark的我跟踪的XML消息,并得到如下:
------- ---------发送
POST /CommunicatorService.svc HTTP/1.1
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://tempuri.org/ICommunicatorService/GetVersion"
User-Agent: JAX-WS RI 2.2.4-b01
Host: 192.168.201.210:7770
Connection: keep-alive
Content-Length: 373
<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><GetVersion xmlns="http://tempuri.org/" xmlns:ns2="http://schemas.microsoft.com/2003/10/Serialization/Arrays" xmlns:ns3="http://schemas.datacontract.org/2004/07/DieboldEras.WorkflowContracts" xmlns:ns4="http://schemas.microsoft.com/2003/10/Serialization/"/></S:Body></S:Envelope>
------响应------------
HTTP/1.1 400 Bad Request
Content-Type: text/html
Date: Fri, 01 Mar 2013 20:51:18 GMT
Connection: close
Content-Length: 39
<h1>Bad Request (Invalid Hostname)</h1>
我与主机参数发挥各地,使用S erver的完整DNS名称,但结果相同。这是配置文件:
-----配置------
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<services>
<service name="DieboldEras.ImagewayCommunicator.Components.CommunicatorService" behaviorConfiguration="DieboldEras.ImagewayCommunicator.Components.CommunicatorServiceBehavior">
<endpoint binding="basicHttpBinding"
bindingConfiguration="basicHttpBinding" name="basicHttp" bindingName="basicHttpBinding"
contract="DieboldEras.ImagewayCommunicator.Components.ICommunicatorService" >
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://192.168.201.210:7770/CommunicatorService" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="DieboldEras.ImagewayCommunicator.Components.CommunicatorServiceBehavior">
<!-- 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>
<bindings>
<wsHttpBinding>
<binding name="wsHTTPBinding"/>
</wsHttpBinding>
<mexHttpBinding>
<binding name="mexHTTPBinding"/>
</mexHttpBinding>
<basicHttpBinding>
<binding name="basicHttpBinding" />
</basicHttpBinding>
</bindings>
<client />
</system.serviceModel>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
我使用Java客户端NetBeans和代码是直截了当:
- ----- Java代码--------
CommunicatorService service = new CommunicatorService();
ICommunicatorService port = service.getBasicHttp();
((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://192.168.201.210:7770/CommunicatorService.svc");
String version = port.getVersion();
任何指针/调试技巧都会有所帮助。我对Java并不熟悉,所以我不确定从哪里开始,但似乎发送的消息中有些内容是错误的,我可以更改消息或服务的配置以知道期望的内容,我只是不知道那是什么。
在此先感谢!
似乎是网络问题而不是WCF。你是从不同的机器运行java代码吗?检查网络和IIS设置。 – 2013-03-01 22:28:14