WCF 4.0 с клиентом PHP 5 - PullRequest
       5

WCF 4.0 с клиентом PHP 5

3 голосов
/ 24 октября 2011

Я пытаюсь сделать PHP-клиент для веб-службы WCF.Но я получаю некоторые ошибки, когда я вызываю функции сервиса.

App.config

<system.serviceModel>
<services>
  <service behaviorConfiguration="MyServiceBehavior"
           name="GSC.Wcf.Services.CartService">
    <endpoint address=""
              binding="basicHttpBinding"
              contract="GSC.Wcf.Services.ICartService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding"
              contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8731/CartService" />
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="MyServiceBehavior">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Функция:

> public int Addiere(int a, int b)
        {
            return a + b;
        }

PHP-запрос:

> $client = new SoapClient("http://localhost:8731/CartService?wsdl");
>
> $result = $client->Addiere(2,4);

для этихЯ получаю сообщение об ошибке типа:

"Исключение Uncaught SoapFault: [a: DeserializationFailed] средство форматирования Formatierer повторно выпустило исключение во время десерилизации сообщения: не удалось десериализовать тело запроса сообщенияпредназначен для операции "Addiere". Ожидается конечный элемент "Body" aus Namespace "http://schemas.xmlsoap.org/soap/envelope/".Найден элемент "param1" пространства имен "".

На немецком языке:

Неустранимая ошибка: Uncaught Исключение SoapFault: [a: DeserializationFailed] Der Formatierer hat beim Deserialisierender Nachricht eine Ausnahme ausgel¶st: Fehler beim Deserialisieren des Textkürpers der Anforderungsnachricht for Vorgang "Addiere".Es wurde das Endelement "Body" aus Namespace "http://schemas.xmlsoap.org/soap/envelope/" erwartet. Gefunden wurde" Element "param1" aus Namespace "" ". Zeile 2, позиция 148. в C: \ xampp \ htdocs \ TestClient \ Client.php: 6 Stackтрассировка: 0 C: \ xampp \ htdocs \ TestClient \ Client.php (6): SoapClient -> __ call ('Addiere', Array) # 1 C: \ xampp \ htdocs \ TestClient \ Client.php (6): SoapClient-> Addiere (2, 4) # 2 {main}, брошенный в C: \ xampp \ htdocs \ TestClient \ Client.php в строке 6

Но эта функция работает:

C #

> public string Message()
        {
            return "WORD";
        }

PHP

> $result = $client->Message();
var_dump($result);

result

object (stdClass) # 2 (1) {["MessageResult"] => string (4)) "WORD"} WORD

единственная проблема в том, что тип возвращаемого значения не является строкой.

Может кто-нибудь догадаться, что не так, или я могу опубликовать еще кое-что наподобие wsdl? ИлиКто-нибудь знает хорошие источники, где я могу посмотреть, как я могу получить правильные конфигурации для связи с моим сервисом?

1 Ответ

11 голосов
/ 26 октября 2011

Проблема решена.

При вызове метода с более чем 2 параметрами вам нужно поместить их в массив, подобный этому

$result = $client->Addiere(array("a" => 2, "b" => 3))->AddiereResult;

, а другая проблема была типом возврата, это решается с помощью

....->AddiereResult;

не уверен, что означает последняя часть, но она работает, я пойму это.

...