Как указано в заголовке, у меня есть служба WCF, размещенная в службе Windows. Когда я использую Visual Studio WCFTestClient, метод GetVersion() (который просто возвращает строку) отлично работает. Когда я пытаюсь вызвать тот же метод с Java-клиента, я получаю недопустимую ошибку имени хоста.Windows Hosted WCF Service Возвращает 400 Bad Request Недопустимое имя хоста для клиента 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 полное DNS-имя erver, но результат был таким же. Это конфигурационный файл:
----- Config ------
<?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>
Я использую NetBeans для клиента Java и код прямо вперед:
- ----- Код 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. –