Silverlight и NuSoap - PullRequest
       9

Silverlight и NuSoap

2 голосов
/ 28 ноября 2009

РЕДАКТИРОВАТЬ: После некоторых исследований, я нашел ответ на проблему (по крайней мере, это работает для моей конкретной ситуации). Вместо того, чтобы регистрировать вызов, отмеченный ниже, я теперь использую следующий вызов:

$soap->register(
                'MyFunction',
                array('inputData' => 'xsd:string'),
                array('outputData' => 'xsd:string'),
                $namespace,
                $namespace . "#MyFunction",
                "rpc",
                "literal",
                "My description.");

Я полагаю, что аргументы "rpc" и "literal" являются ключом к успеху. Надеюсь, это поможет другим пользователям, столкнувшимся с той же проблемой.


У меня проблема с новым проектом, где приложение silverlight запрашивает данные у службы NuSoap. Поскольку эта интеграция довольно нова для меня, и, к сожалению, в интернете не так много ресурсов по этой теме (по крайней мере, ни один из них не посвящен моей проблеме), я надеюсь, что кто-то может указать мне правильное направление.

NuSoap-часть реализована так:

<?php
   require_once('../soap/nusoap/nusoap.php');

   $namespace = "http://127.0.0.1/adminSoap";
   $soap = new Soap_Server();
   $soap->configureWSDL('MyService', $namespace);
   $soap->wsdl->schemaTargetNameSpace = $namespace;
   $soap->soap_defencoding = 'utf-8';

   $soap->register(
                'MyFunction',
                array('inputData' => 'xsd:string'),
                array('outputData' => 'xsd:string'),
                $namespace

   );

   $soap->service(isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '');

   function MyFunction($inputData)
   {
       return "ok";
   }

?>

Затем я добавляю веб-ссылку на этот сервис и получаю диалоговое окно, в котором я могу выбрать сервис, его ServicePortType, а также «MyFunction».

Однако, если я сгенерирую ссылку, я бы предположил найти автоматически сгенерированные асинхронные сообщения для MyFunction (т.е. MyFunctionAsync и MyFunctionCompleted.event). Их не существует.

Что я мог делать не так? Вот код, который настраивает клиента:

ServiceReference4.MyServicePortTypeClient client = new SilverlightTest1.ServiceReference4.MyServicePortTypeClient();

Есть идеи, почему асинхронный метод недоступен?

Вот сгенерированный WSDL, если это поможет, кстати (дефис из-за копирования / вставки из IE):

<definitions targetNamespace="http://127.0.0.1/adminSoap">
−
<types>
−
<xsd:schema targetNamespace="http://127.0.0.1/adminSoap">
<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
<xsd:import namespace="http://schemas.xmlsoap.org/wsdl/"/>
</xsd:schema>
</types>
−
<message name="MyFunctionRequest">
<part name="affiliate" type="xsd:string"/>
</message>
−
<message name="MyFunctionResponse">
<part name="result" type="xsd:string"/>
</message>
−
<portType name="MyServicePortType">
−
<operation name="MyFunction">
<input message="tns:MyFunctionRequest"/>
<output message="tns:MyFunctionResponse"/>
</operation>
</portType>
−
<binding name="MyServiceBinding" type="tns:MyServicePortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
−
<operation name="MyFunction">
<soap:operation soapAction="http://127.0.0.1/magento/adminSoap/SoapStatsService.php/MyFunction" style="rpc"/>
−
<input>
<soap:body use="encoded" namespace="http://127.0.0.1/adminSoap" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
−
<output>
<soap:body use="encoded" namespace="http://127.0.0.1/adminSoap" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
−
<service name="MyService">
−
<port name="MyServicePort" binding="tns:MyServiceBinding">
<soap:address location="http://127.0.0.1/magento/adminSoap/SoapStatsService.php"/>
</port>
</service>
</definitions>

1 Ответ

0 голосов
/ 07 декабря 2009

Я работаю над аналогичной проблемой. Я использовал Zend_Soap (который просто обертывает расширение PHP SOAP) и использовал ссылку на сервис Silverlight для подключения к нему. Кажется, что реализация службы Silverlight не может сделать нас из мыльных операций. Если вы посмотрите на WSDL под каждым есть и. В этих тегах есть атрибуты, которые нас обоих расстраивают. Атрибуты use = "encoded" и encodingStyle = "blah, blah".

Теперь я знаю, что Zend_Soap будет делать только привязки, использующие кодирование мыла. Я еще не уверен насчет nuSoap.

Если вы можете изменить серверную часть PHP, вы можете заглянуть в Midnight Coders WebORB для PHP и Silverlight. Он включает в себя решение для сервера и клиента, которые работают вместе. Это доступно бесплатно для определенных обстоятельств. Из-за проблем с лицензированием я не смогу нам это сделать.

...