Метод веб-сервиса Java, получающий нулевой аргумент от клиента C#

Я работаю на сервере приложений Java 6, который имеет веб-сервис для получения сообщений SOAP, содержащих сообщение HL7. Java-приложение работает на Glassfish 3.1. Клиент является сторонним разработанным приложением на C# (которое работает на фреймворке Microsoft .net 4.0) и посылает эти SOAP-сообщения на Java-сервер.

Моей первоначальной проблемой было то, что клиент не смог разобрать WSDL, сгенерированную сервером. С тех пор я решил эту проблему, реализовав свою собственную WSDL и настроив ее соответствующим образом. Это позволило клиенту разобрать WSDL и отправить SOAP-сообщения на мой Java-сервер.

Однако каждый раз при получении сообщения на стороне сервера параметр (названный "putXML") получает значение null .

Лог сервера Glassfish показывает следующее при получении сообщения:

Received WS-I BP non-conformant Unquoted SoapAction HTTP header: http://MyProject.MyPackage/putHL7Data
Received Message: null

Вот пользовательская WSDL, которую я создал и связал со своим SOAP веб-сервисом:

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions
      targetNamespace="http://MyProject.MyPackage/"
      xmlns="http://schemas.xmlsoap.org/wsdl/"
      xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
      xmlns:s="http://www.w3.org/2001/XMLSchema"
      xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
      xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 
      xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
      xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/"
      xmlns:tns="http://MyProject.MyPackage/" 
      xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" 
      xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
      xmlns:wsp="http://www.w3.org/ns/ws-policy" 
      xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema">   
   <wsdl:types>
      <s:schema elementFormDefault="qualified" targetNamespace="http://MyProject.MyPackage/">
         <s:element name="putHL7Data">
            <s:complexType>
               <s:sequence>
                  <s:element name="putXML" type="s:string" minOccurs="0" maxOccurs="1"/>
               </s:sequence>
            </s:complexType>
         </s:element>
         <s:element name="putHL7DataResponse">
            <s:complexType>
               <s:sequence>
                  <s:element name="return" type="s:string" minOccurs="0" maxOccurs="1"/>
               </s:sequence>
            </s:complexType>
         </s:element>
      </s:schema>
   </wsdl:types>
   <wsdl:message name="putHL7DataSoapIn">
      <wsdl:part name="parameters" element="tns:putHL7Data"/>
   </wsdl:message>
   <wsdl:message name="putHL7DataSoapOut">
      <wsdl:part name="parameters" element="tns:putHL7DataResponse"/>
   </wsdl:message>
   <wsdl:portType name="MyHandlerSoap">
      <wsdl:operation name="putHL7Data">
         <wsdl:input message="tns:putHL7DataSoapIn"/>
         <wsdl:output message="tns:putHL7DataSoapOut"/>
      </wsdl:operation>
   </wsdl:portType>
   <wsdl:binding name="MyHandlerSoap" type="tns:MyHandlerSoap">
      <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
      <wsdl:operation name="putHL7Data">
         <wsdl:input>
            <soap:body use="literal"/>
         </wsdl:input>
         <wsdl:output>
            <soap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>
   </wsdl:binding>
   <wsdl:service name="MyHandler">
      <wsdl:port name="MyHandlerPort" binding="tns:MyHandlerSoap">
         <soap:address location="REPLACE_WITH_ACTUAL_URL"/>
      </wsdl:port>
   </wsdl:service>
</wsdl:definitions>

А вот Java веб-сервис:

@WebService(serviceName = "MyHandler", wsdlLocation = "WEB-INF/wsdl/MyHandler.wsdl")
public class MyHandler {
   @WebMethod(operationName = "putHL7Data")
   public String putHL7Data(@WebParam(name = "putXML") String xml) {
      // Handle message
   }
}

Есть ли что-то, что я делаю неправильно?

Что я могу сделать, чтобы исправить Java веб-сервис так, чтобы он правильно получал ненулевое значение?

Является ли это проблемой с клиентом? Если да, нужно ли мне создавать какой-нибудь перехватчик?

Обновление

Сегодня я попробовал создать быстрый C#-клиент, который использует мой веб-сервис Java SOAP. Ниже приведен код:

namespace TestSoap
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceReference1.MyHandlerSoapClient ws = new ServiceReference1.MyHandlerSoapClient();
            string result = ws.putHL7Data("Test");    
            Console.WriteLine("Response: " + result);
            Console.ReadLine();
        }
    }
}

При запуске этого клиента я получаю то же самое значение null в параметре, когда ожидал увидеть строку Test. Также я ожидаю, что результат result будет содержать ответную строку, но она также возвращает значение null.

Помните, я не могу модифицировать клиентское приложение C# стороннего производителя. Могу ли я что-нибудь сделать со стороны Java?

Обновление 2

Недавно я добавил класс обработчика, который захватывает и протоколирует необработанные сообщения SOAP. Сообщение, отправляемое клиентом, выглядит следующим образом:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soap:Header/>
  <soap:Body>
    <putHL7Data xmlns="http://MyProject.MyPackage/">
      <putXML>... Encoded XML Here ...</putXML>
    </putHL7Data>
  </soap:Body>
</soap:Envelope>
8
задан Paul Bellora 3 February 2013 в 02:31
поделиться