【问题标题】:PHP Soap Client and .NET Web ServicePHP Soap 客户端和 .NET Web 服务
【发布时间】:2011-09-06 16:05:32
【问题描述】:

大家好,我正在尝试使用 SoapClient 使用 PHP 来使用 .NET,但是当我的 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>

【问题讨论】:

  • 你能说得更具体点吗?服务的预期格式是什么,soapClient 生成的格式是什么?另外,你能看到 $client->getLastRequest() 和 $client->getLastResponse() 返回什么吗?
  • 我用我得到的结果编辑了我的问题......谢谢建议我可以做 $client->__getFunctions() 并且效果很好......

标签: php .net web-services soap


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    要使用 .Net Web 服务,请使用 NetBeans IDE,添加“服务”并指向 .net Web 服务(确保将 ?WSDL 放在末尾),然后从“服务”拖放' 工具箱到一个 php 文件,它会为你编写代码 :)

    效果也很好。

    [我不能说你的代码有什么问题]

    【讨论】:

      【解决方案3】:

      我最近在帮助客户使用我们的 .Net 网络服务时也遇到了这个问题,所以我想我会分享一下,以防其他人将来遇到这个问题。

      感谢 adudly 提供帮助阐明该问题的指导。您必须为数组中的参数提供名称,并注意名称区分大小写。

      工作代码

      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;
      }
      

      希望将来能对某人有所帮助。

      【讨论】:

        【解决方案4】:

        你可以使用 SoapHeader 和 setSoapHeaders here

        【讨论】:

        • 您能否提供一个代码示例,说明如何使用 SoapHeader 和 setSoapHeaders 将直接回答问题?
        • 我错了,我以为登录是从头部发送的,我认为你需要传递一个LoginRequest类的对象。
        猜你喜欢
        • 2012-05-31
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多