soapphp调用.NET。无参数

soapphp调用.NET。无参数,php,soap,native,Php,Soap,Native,各位 我在PHP中使用SOAPClient调用.NET Web服务。一切都很好,直到我传递参数为止。远程Web服务向处理响应的listener.php文件发出请求,但目前它似乎无法获取参数。。。在发送请求之前检查请求似乎不会在XML中显示参数 有人能告诉我如何传递参数吗?到目前为止,我已经看到了大约3种不同的方式,包括但不限于以下方式: $pCriteria->AuctionID=newsoapvar($auction_id,XSD_INT,'XSD:INT') 或: $ar\u biddupd

各位

我在PHP中使用SOAPClient调用.NET Web服务。一切都很好,直到我传递参数为止。远程Web服务向处理响应的listener.php文件发出请求,但目前它似乎无法获取参数。。。在发送请求之前检查请求似乎不会在XML中显示参数

有人能告诉我如何传递参数吗?到目前为止,我已经看到了大约3种不同的方式,包括但不限于以下方式:

$pCriteria->AuctionID=newsoapvar($auction_id,XSD_INT,'XSD:INT')

或:

$ar\u biddupdate\u params\u total=array('AuctionID'=>$auction\u id,'parameter 2…等)

或:

$ar\u biddupdate\u params=数组(
新的SoapParam($auction_id,'AuctionID'),

示例代码还显示了以各种方式调用它(从我在web上看到的情况来看)

$info=$soapClient->\u调用(“biddupdate”,数组($pCriteria));

$info=$client->biddupdate($pCriteria);

问题是,1)如何使用本机SoapClient可靠地传递这些参数,2)最好的方法是什么


或者,如果我不能让它发挥作用,我可能只是动态地构建XML。如果我真的选择了这种方法,那么发送XML字符串的最佳方式是什么?

来证明您的担忧:是的,使用SoapClient可能会令人沮丧。主要是因为文件。不过,这里有一段示例代码供您参考,我不久前为一个项目工作过。我最终在一个图书馆中使用了这种技术作为支付网关。我知道这对于从字符串名中取消引用的函数调用来说并不完美,但它确实有效

$method = "ACTION";
$wsdl = "WSDLFILE.wsdl";
$parameters = array (
    'location'              =>  "http://url.com",
    'local_cert'            =>  "/full/path/to/CERTIFICATE.pem,"
    'passphrase'            =>  "TEST-PASSWORD",
    'use'                   =>  SOAP_ENCODED ,
    'connection_timeout'    =>  4,
    'user_agent'            =>  null
);
$client = new SoapClient( $wsdl, $parameters );
$response = $client->{$method}( $data );
var_dump( $response );
更详细地说,在您设置了wsdl和证书(如果需要的话)之后,SoapClient会动态创建一个函数($method),该函数与wsdl中的内容相对应,即:用于诸如“Capture()”或“Authorize()”之类的操作。然后,客户机处理XML发送/解析。是否使用SOAP_编码,以及如何传递参数,实际上取决于另一端的内容

不过,我已经处理过手动创建信封XML的问题,我建议不要这样做。只要您获得了一个好的WSDL转储,.NET项目将自动完成,而且不应该是一个问题,那么如果/当它被更改/更新时,这是避免维护噩梦的一个好方法,而不是必须手动旋转XML文本。

1)如何使用本机SoapClient可靠地传递这些参数 这很困难,因为PHP不喜欢给出很好的调试错误。确保您测试了所有调用,以确保超时设置正确(PHP只在超时错误时返回false)并且参数正确。唯一可靠地做到这一点的方法是确保您知道什么对您的系统有效,并保持在这些参数之内。检查所有不同的选项(超时、凭据等),并对它们进行操作,直到您得到真正可靠的结果

2) 最好的方法是什么? 您的两个调用都是正确的语法,而且参数结构实际上没有那么复杂,只是先让某些东西工作起来,这是最困难的部分。我的结构通常类似于: $opts=数组(…选项…); $client=新的SoapClient('https://URL/WebAPI/WebAPI.asmx?WSDL“,$opts)

然后像这样打电话:

$result = $client->call('GetAllMembers',$paramters);
这是我对一个成功结果的正常循环:

foreach ($result['GetMemberAllResult']['MemberData'] as $key => $value)
{
   //code 
}

不过,对我帮助最大的是我使用SoapUI设置了所有内容(http://www.soapui.org/)然后将所有内容迁移到PHP。在那里,您可以运行测试,并使用为SOAP设计的工具准确地了解调用中发生了什么

只是想让你们都知道我们是如何相处的。。我遇到的问题是由于定义了一个更复杂的类型,因此它从未作为单个参数输入函数,而是作为类输入函数,这只在定义了“类映射”时发生

我们意识到,当试图通过.NET使用该服务时,需要进行一些额外的操作(MS在Visual Studio中为您绑定所有内容),很明显,一个额外的类被作为参数传递,如果我们对WSDL有更多的了解,这一点可能会很明显

$classmap = array('UpdateInfo' => 'UpdateInfo');

$server = new SoapServer("domain.com/Listener.wsdl", array('classmap' => $classmap, 'soap_version' => SOAP_1_2, 'encoding' => 'UTF-8', 'uri' => 'http://tempuri.org/'));#

参数数组按正常方式传递。谢谢你们两位的帮助,尽管这不是我需要的方向

建议您缓存wsdl文件,以加快处理速度并减少不必要的网络流量。根据php网站,不推荐使用“\uuu call”,而“\uu soapCall”更适用于非wsdl模式。您可以直接在对象上调用方法,我会取消引用它们,这样它们就不会在主comm模块中硬编码,而是在自定义类代码的其他地方指定。不客气。谢谢分享。总的来说,我使用SOAP的经验告诉我们,工作起来很麻烦,不过一旦工作起来就很好了。
$classmap = array('UpdateInfo' => 'UpdateInfo');

$server = new SoapServer("domain.com/Listener.wsdl", array('classmap' => $classmap, 'soap_version' => SOAP_1_2, 'encoding' => 'UTF-8', 'uri' => 'http://tempuri.org/'));#