Я работаю на сервере приложений Java 6, в котором есть веб-служба для получения сообщений SOAP, содержащих сообщение HL7.Java-приложение работает на Glassfish 3.1.Клиент является разработанным сторонним приложением C # (которое работает на платформе Microsoft .net 4.0) и отправляет эти сообщения SOAP на сервер Java.
Моя первоначальная проблема заключалась в том, что клиент не смог выполнить синтаксический анализWSDL, сгенерированный сервером.С тех пор я решил это, реализовав свой собственный WSDL и настроив его соответствующим образом.Это позволило клиенту проанализировать WSDL и отправить сообщения SOAP моему приложению на сервере Java.
Однако каждый раз, когда сообщение принимается на стороне сервера, параметр (с именем «putXML») получает null
value.
Журнал сервера 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>