我正在尝试从PHP调用一个WCF服务(.NET)。这比仅使用SoapClient
要复杂一些,因为该服务使用WS2007FederationHttpBinding
进行身份验证。
目前我正在使用的代码如下。我甚至还没有添加凭据,因为我不确定如何添加,但无论如何,我甚至没有到达访问被拒绝错误的点。
$wsdl = "https://slc.centershift.com/sandbox40/StoreService.svc?wsdl";
$client = new SoapClient($wsdl,array(
//'soap_version'=>SOAP_1_2 // default 1.1, but this gives 'Uncaught SoapFault exception: [HTTP] Error Fetching http headers'
));
$params = array();
$params['SiteID'] = 123;
$params['GetPromoData'] = false;
$ret = $client->GetSiteUnitData(array('GetSiteUnitData_Request'=>$params));
print_r($ret);
我应该指向哪个WSDL?
https://slc.centershift.com/Sandbox40/StoreService.svc?wsdl
看起来非常简短,但包含一个引用(请注意wsdl0
):https://slc.centershift.com/Sandbox40/StoreService.svc?wsdl=wsdl0
https://slc.centershift.com/Sandbox40/StoreService.svc?singleWsdl
似乎包含了所有内容。
我需要指定SOAP 1.2吗?当我指定时,出现连接超时错误(
[HTTP] Error Fetching http headers
)。当我不指定时,使用了SOAP 1.1的默认值,我得到了一个错误[HTTP] Cannot process the message because the content type 'text/xml; charset=utf-8' was not the expected type 'application/soap+xml; charset=utf-8'
。这是因为我还没有认证,还是因为我使用了错误的SOAP版本?如何在PHP中进行身份验证?这是相应的.NET/C#代码。我是否需要将它们作为SOAP头部的一部分进行传递?或者我考虑得有问题,我需要在调用方法之前进行某种类型的身份验证(从我读到的信息中,我应该得到一个令牌,然后将其用于所有未来的方法调用——我认为我在Stack Overflow上的一个答案中看到了一个示例。
如果我使用任何WSDL和任何SOAP版本调用$client->__getFunctions()
,我都会获得一个有效的所有函数列表,因此我认为这两者都可以正常工作,而我的真正问题是身份验证。
我与其他程序员交流过,他们花费时间尝试使其工作,但最终放弃并在.NET中实现了一个代理。他们将参数从PHP传递到自己的不安全的.NET服务,然后调用该安全服务。这是可行的,但对我来说似乎效率很低,并且适得其反,因为WCF的目的是支持所有类型的客户端(甚至是非HTTP的客户端!)。
我已经阅读了MSDN上的 How to: Create a WSFederationHttpBinding,但没有帮助。
mail()
。我没有使用过PHP的SOAP,所以无法提供帮助。 - Palec