У меня есть PHP-служба PHP, закодированная в RPC, которая возвращает простой мыльный конверт с булевым типом данных. При выполнении трассировки на стороне клиента мыльный конверт выглядит так, как прежде, чем он войдет в прокси-сервер WCF:
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://sample.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org /soap/encoding/"> <SOAP-ENV:Body> <ns1:ServiceMessageResponse> <outgoingVar1>true</outgoingVar1> </ns1:ServiceMessageResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
Однако, когда возвращаемое значение выходит на другую сторону прокси, оно было изменено на false. Я попытался добавить xsi: type = "xsd: boolean" в outgoingVar1, но это не помогает. Сам конверт мыла – это именно то, чего должен ожидать клиент, но по какой-то причине он не будет его правильно использовать. Это что-то, что связано с тем, как настроен веб-сервис PHP или находится в прокси-сервере WCF? Веб-служба PHP просто настраивается следующим образом:
ini_set('soap.wsdl_cache_enabled', '0'); ini_set('soap.wsdl_cache_ttl', '0'); $soapServer = new SoapServer('wsdl/sample.wsdl', array('soap_version' => SOAP_1_1)); $soapServer->addFunction('Service'); $soapServer->handle();
и функция заканчивается простым «return true»; линия. Здесь ничего сложного. Есть идеи, что может быть проблемой?
Аннотированный WSDL (удаленные тривиальные пространства имен и модифицированные реальные) выглядит следующим образом:
<wsdl:definitions name="IJLSoapResponse" targetNamespace="http://casey.com" tns="http://casey.com" xmlns:samp="http://sample.com" ...> <wsdl:types> <xsd:schema targetNamespace="http://casey.com" ...> <xsd:element name="incomingVar1" type="xsd:string" nillable="true"/> <xsd:element name="incomingVar2" type="xsd:string" nillable="true"/> </xsd:schema> <xsd:schema targetNamespace="http://sample.com" ...> <xsd:element name="outgoingVar1" type="xsd:boolean" nillable="true"/> </xsd:schema> </wsdl:types> <wsdl:message name="ServiceInput"> <wsdl:part name="incomingVar1" element="tns:incomingVar1"/> <wsdl:part name="incomingVar2" element="tns:incomingVar2"/> </wsdl:message> <wsdl:message name="ServiceOutput"> <wsdl:part name="outgoingVar1" element="samp:outgoingVar1"/> </wsdl:message> <wsdl:portType name="ServicePortType"> <wsdl:operation name="ServiceMessage" parameterOrder="incomingVar1 incomingVar2"> <wsdl:input name="ServiceMessageRequest" message="tns:ServiceInput"/> <wsdl:output name="ServiceMessageResponse" message="tns:ServiceOutput"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="ServiceBinding" type="tns:ServicePortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="ServiceMessage"> <soap:operation soapAction="http://casey.com/soap/Service"/> <wsdl:input name="ServiceMessageRequest"> <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://casey.com"/> </wsdl:input> <wsdl:output name="ServiceMessageResponse"> <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://sample.com"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="ServiceService"> <wsdl:port name="ServicePort" binding="tns:ServiceBinding"> <soap:address location="http://casey.com/soap/Service"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
Этого должно быть достаточно, чтобы увидеть, как все объявлено … дайте мне знать, если вам нужно что-то еще проясненное. Спасибо за вашу помощь!
Можно ли увидеть WSDL службы? Мне интересно, какое пространство имен, исходящее для Var1, предназначено для входа.
Закодированные службы RPC всегда были болью из-за двусмысленности в отношении того, какие части сообщений пространства имен должны быть включены. Меня не удивит, увидев, что это проблема здесь.
В soapUI работает следующая привязка. По крайней мере, он может генерировать макет службы, и ответное сообщение выглядит так, как вы искали (outgoingVar1 в пространстве имен образцов):
<wsdl:binding name="ServiceBinding" type="tns:ServicePortType"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="ServiceMessage"> <soap:operation soapAction="http://casey.com/soap/Service"/> <wsdl:input name="ServiceMessageRequest"> <soap:body parts="incomingVar1 incomingVar2" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://casey.com"/> </wsdl:input> <wsdl:output name="ServiceMessageResponse"> <soap:body parts="outgoingVar1" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://sample.com"/> </wsdl:output> </wsdl:operation> </wsdl:binding>
Решение закончилось тем, что касается пространств имен. Поскольку они не распространялись корректно, мне нужно было добавить атрибут elementFormDefault = «квалифицированный» в схему. Это заставляет префикс присутствовать на каждом элементе, что является единственным способом сделать .NET счастливым. Спасибо за вашу помощь по этому поводу.