2013-03-01 39 views
0

由于标题指示我有一个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并不熟悉,所以我不确定从哪里开始,但似乎发送的消息中有些内容是错误的,我可以更改消息或服务的配置以知道期望的内容,我只是不知道那是什么。

在此先感谢!

+0

似乎是网络问题而不是WCF。你是从不同的机器运行java代码吗?检查网络和IIS设置。 – 2013-03-01 22:28:14

回答

3

这个问题实际上是在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(); 

实际上应该是

CommunicatorService service = new CommunicatorService(); 
ICommunicatorService port = service.getBasicHttp(); 
((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://192.168.201.210:7770/CommunicatorService"); 
String version = port.getVersion(); 

3个字母做出多么大的变化!

感谢您的帮助NileshKRathod。

0

尝试此为您服务模型代码,它可以帮助你......

<system.serviceModel> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
<services> 
    <service name="VInfotech.Server.Intranet.IntranetService" behaviorConfiguration="IntranetService.Service1Behavior"> 
    <!-- Service Endpoints --> 
    <endpoint address="" binding="basicHttpBinding" bindingConfiguration="Binding1" contract="VInfotech.Server.Intranet.IIntranet"> 
     <!-- 
      Upon deployment, the following identity element should be removed or replaced to reflect the 
      identity under which the deployed service runs. If removed, WCF will infer an appropriate identity 
      automatically. 
     --> 
     <identity> 
     <dns value="localhost"/> 
     </identity> 
    </endpoint> 
    </service> 
    <service name="VInfotech.Server.Intranet.MobileServicesController" behaviorConfiguration="ServBehave"> 
    <endpoint address="RestService" bindingConfiguration="StreamedRequestWebBinding" binding="webHttpBinding" behaviorConfiguration="restPoxBehavior" contract="VInfotech.Server.Intranet.IMobileServices" /> 
    </service> 
</services> 
<bindings> 
    <webHttpBinding> 
    <binding name="StreamedRequestWebBinding" 
    bypassProxyOnLocal="true" 
      useDefaultWebProxy="false" 
      hostNameComparisonMode="WeakWildcard" 
      sendTimeout="10:15:00" 
      openTimeout="10:15:00" 
      receiveTimeout="10:15:00" 
      maxReceivedMessageSize="9223372036854775807" 
      maxBufferPoolSize="9223372036854775807" 
      maxBufferSize="2147483647" 
      transferMode="StreamedRequest" > 
     <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" /> 
    </binding> 
    </webHttpBinding> 
    <basicHttpBinding> 
    <binding name="Binding1" closeTimeout="04:01:00" openTimeout="04:01:00" receiveTimeout="04:10:00" sendTimeout="04:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="1073741824" maxBufferPoolSize="1073741824" maxReceivedMessageSize="1073741824" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="1073741824" maxStringContentLength="1073741824" maxArrayLength="1073741824" maxBytesPerRead="1073741824" maxNameTableCharCount="1073741824"/> 
    </binding> 
    <!-- For Cyber Source bindings--> 
    <binding name="ITransactionProcessor" closeTimeout="04:01:00" openTimeout="04:01:00" receiveTimeout="04:10:00" sendTimeout="04:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="1073741824" maxBufferPoolSize="1073741824" maxReceivedMessageSize="1073741824" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
     <readerQuotas maxDepth="1073741824" maxStringContentLength="1073741824" maxArrayLength="1073741824" maxBytesPerRead="1073741824" maxNameTableCharCount="1073741824"/> 
     <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
     <message clientCredentialType="UserName" algorithmSuite="Default"/> 
     </security> 
    </binding> 
    </basicHttpBinding> 
    <!--Cyber Source bindings ends here--> 
</bindings> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="IntranetService.Service1Behavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    <behavior name=""> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    <behavior name="ServBehave"> 
     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <!--Behavior for the REST endpoint for Help enability--> 
    <behavior name="restPoxBehavior"> 
     <webHttp helpEnabled="true" /> 
    </behavior> 
    <behavior name="jsonBehavior"> 
     <enableWebScript /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<client> 
    <endpoint address="https://ics2wstest.ic3.com/commerce/1.x/transactionProcessor" binding="basicHttpBinding" bindingConfiguration="ITransactionProcessor" contract="ITransactionProcessor" name="portXML"/> 
</client> 
<diagnostics> 
    <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" maxMessagesToLog="3000" maxSizeOfMessageToLog="2000"/> 
</diagnostics> 

我希望这会帮助你。 :)

相关问题