Intereting Posts
Как извлечь только столбцы с ненулевыми значениями в mysql и php? Разработка пикселя отслеживания Файлы, не хранящиеся в правильной папке PHP-функция для построения строки запроса из массива – не HTTP-запрос Использование PDO для вставки нескольких записей в несколько таблиц из одного оператора? PHP cURL: HTTP-заголовки показывают 302 и файлы cookie, файлы cookie сохраняются и отправляются, появляются одни и те же заголовки? Переменные функции с пространствами имен в PHP Laravel: удалить публикацию из URL-адреса, одновременно сохраняя отдельные проекты Обманывание целых чисел PHP Как работает jQuery.post () с Content-Disposition: attachment? remove_action Из класса PHP Селективно наследует части объекта PHP Функция по умолчанию Значения параметров, как «передать значение по умолчанию» для «не последних» параметров? Как создавать эскизы или предварительный просмотр видео? Поставщик Oauth за обратным прокси

Прокси-сервер клиента WCF возвратил SOAP-конверт

У меня есть 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 счастливым. Спасибо за вашу помощь по этому поводу.