我有一个WCF Web服务,允许基本HTTP和WS-HTTP客户端,都通过HTTPS使用用户名&密码验证。这是通过在同一服务上使用两个绑定来实现的。
因此,服务位于 https://foo.com/Service.svc ,基本HTTP(SOAP 1.1)端点是 https://foo.com/Service.svc/Unp11 ,以及WS-HTTP( SOAP 1.2)端点是 https://foo.com/Service.svc/Unp 。
客户端正在尝试使用其内置的SOAP支持通过PHP 5访问此Web服务,并且无法连接到该服务。他不断收到HTTP 400(错误请求)响应,如果SOAP消息格式错误,或者SOAP 1.1消息发送到SOAP 1.2端点(反之亦然),则会发生这种情况。
我只知道基本的PHP,所以我无法帮助他。我知道你可以通过
创建一个客户端$client = new SoapClient('https://foo.com/Service.svc?wsdl');
但是如何指定绑定/端点?使用PHP实现这一切是否存在任何已知问题?
更新
好的,我可以使用PHP连接到WCF服务ok(在SoapClient
构造函数中指定SOAP版本),并调用$client->__getFunctions()
返回所有Web服务操作的正确列表。
当我尝试使用$client->__soapCall
调用一个时,页面只是在那里加载了很长一段时间,并最终返回错误“ Error Fetching http headers ”。究竟是什么意思,我该如何解决? (从.Net客户端使用该服务非常有效。)
答案 0 :(得分:5)
今天刚刚遇到这个问题,为PHP调用者创建了一个带有多个绑定的WCF。设置位置似乎允许PHP的SoapClient的WSDL版本并指定要使用的绑定。
WCF配置是(1个服务,带有2个绑定wsHttp和basicHttp),非常简单。
PHP代码:
$client = new SoapClient("http://example.com/service.svc?wsdl");
$client->__setLocation("http://example.com/service.svc/basic");
$response = $client->MethodName(array( "paramName" => "paramValue" ... ));
答案 1 :(得分:1)
我们有一个SOAP服务,它有几个绑定。在C#中,当你向wsdl添加一个服务引用时,你会得到一个为每个创建的类,但是在PHP中你似乎无法指定你想要使用哪个绑定 - 当绑定具有冲突的类型/方法时,这会引起我的问题名。它看起来似乎确实很好但是我真的不知道它是如何在内部处理的。
我遇到的另一个常见问题是我总是需要在数组或结构的加载中包装参数 - 如果服务器期望参数并且您没有正确设置它,有时您会收到错误的请求。 (见Having trouble getting my head around SOAP in PHP)
不确定这有多大帮助,只是一些想法。还有一些用PHP编写的第三方Soap客户端实现值得关注,但它们会慢得多。