PHP Soap Client и .NET Web Service - PullRequest
       4

PHP Soap Client и .NET Web Service

0 голосов
/ 06 сентября 2011

Привет всем, я пытаюсь использовать .NET с PHP, используя SoapClient, но у меня возникла следующая проблема, когда мой php-клиент отправил запрос, .NET WS не получает XML-запрос в нужном формате, вот мой кодпомогите мне, спасибо ind совет

class login {
    public $User;
    public $Password;
}

$logr = new login;

$logr->User = 'user';
$logr->Password = 'pass';


try {
    $client = new soapclient ("http://..../Service.asmx?WSDL", array('classmap' => array('LoginRequest' => 'login'),));


    print_r($logr);
    $client -> Login ($logr);

}
catch (Exception $e) {
    echo "Error!<br />";
    echo $e -> getMessage ();
}

, когда я тестирую свой .net-сервер на .net-приложении, я отправляю это, и он хорошо работает

<soap:Envelope
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2011/XMLScheme">
    <soap:Body>
        <Login
            xmlns="http://tempuri.org">
            <LoginRequest>
                <User>user</User>
                <Password>pass</Password>
            </LoginRequest>
        </Login
    </soap:Body>
</soap:Envelope>

, но когда я тестирую егоphp я получаю это, и эта ошибка Сервер не смог обработать запрос.---> Ссылка на объект не установлена ​​на экземпляр объекта.

<SOAP-ENV:Envelope
        xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope"
        xmlns:ns1="http://tempuri.org"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        <SOAP-ENV:Body>
            <Login
                xmlns="http://tempuri.com"
                xso:type="ns1:LoginRequest">
                    <User>user</User>
                    <Password>pass</Password>
            </Login>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

Ответы [ 4 ]

1 голос
/ 08 декабря 2011
class LoginRequest {
    public $User;
    public $Password;

    public function __construct($usr, $pwd) {
         $this->User = $usr;
         $this->Password = $pwd;
    }
}

$login = new LoginRequest('user', 'password');

$client = new SoapClient('http://..../services.asmx?wsdl');
$client->login($login); // try 1
$client->login(array('LoginRequest' => $login)); //try 2
0 голосов
/ 28 января 2014

Я недавно столкнулся с этой проблемой, когда помогал клиенту использовать наш веб-сервис .Net, поэтому я решил поделиться этим, если кто-нибудь еще столкнется с этим в будущем.

Спасибо большое за руководство, которое помогло пролить свет на проблему. Вы должны предоставить имя для параметра в массиве, и обратите внимание, что имя чувствительно к регистру.

Рабочий код

try {
    $wsdl_url = 'http://<mywebserver>/LeadWs.svc?wsdl';
    $client = new SOAPClient($wsdl_url);

    $params = array(
        'lead' => ""
    );
    $return = $client->Insert2($params);

    print_r($return);
} catch (Exception $e) {
    echo "Exception occurred: " . $e;
}

В моих неудачных попытках использовалась заглавная буква «L». Это, очевидно, единственная вещь в WSDL / XSD, которая по умолчанию является строчной. Если вы выполните тщательный поиск по WSDL / XSD, вы увидите точные имена любых параметров, ожидаемых вашим методом. Как только вы это сделаете, SoapClient обрабатывает остальную часть кодировки XML.

Мой окончательный код выглядел так:

try {
    $wsdl_url = 'http://<mywebserver>/LeadWs.svc?wsdl';
    $client = new SOAPClient($wsdl_url);

    $lead = new Lead(); // Could just be an array as well
                        // but I created a class to help the user
    $lead->FirstName = "Tester";
    $lead->LastName = "Test";
    $lead->ZipCode = "00000";
    $lead->NumberOfTVs = 2;

    $params = array('lead' => $lead);
    $return = $client->Insert2($params);

    print_r($return);
} catch (Exception $e) {
    echo "Exception occurred: " . $e;
}

Надеюсь, это поможет кому-то в будущем.

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

Чтобы использовать веб-сервис .Net, используя IDE NetBeans, добавьте «сервис» и укажите на веб-сервис .net (обязательно поставьте «WSDL» в конце), а затем перетащите из «сервиса»'toolbox в php-файл, и он пишет код для вас :)

тоже отлично работает.

[Хотя я не могу сказать, что не так с вашим кодом]

0 голосов
/ 13 сентября 2011

Вы можете использовать SoapHeader и setSoapHeaders здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...