我有C#/ ASP.NET Web服务,它运行在远程服务器上并使用WSDL。直到最近它被移动到另一台服务器时,它工作正常。但是,这意味着我必须更改硬编码的数据库连接字符串,因此需要在我的开发计算机上重建代码并上传到服务器。
使用SOAP在另一个Web服务器上运行的PHP脚本调用该服务。
出于某种原因,从我所知道的,它正在尝试运行旧代码,即使我已经修改过它。
e.g。如果我改变我的Web服务功能只返回,例如,“Hello,World”,它似乎仍然试图连接到数据库等(但由于该数据库不再存在而失败,我相信它仍在尝试使用旧的连接字符串)
如果我删除该功能,它会告诉我该功能不存在。 (所以它正在寻找合适的地方)
如果我添加一个新函数并尝试从php脚本调用它,我会收到错误
The server did not recognize the value of HTTP Header SOAPAction
如果我尝试使用http://localhost/Myservice/Myservice.asmx
在实际服务器上测试它,一切正常!
以下是我用来调用的代码:
ini_set("soap.wsdl_cache_enabled", 0);
$client = new SoapClient("http://1.2.3.4:8083/MyService/MyService.asmx?WSDL&revision=1", array('cache_wsdl' => WSDL_CACHE_NONE));
$input = new stdClass;
$input->inputvals = '15707F';
echo "Functions: |";
print_r($client->__getFunctions()); // Lists all functions including new ones
echo "|\n\n";
$Response = $client->checkPrice($input);
print_r($Response);
要部署代码,这就是我正在做的事情 - 在本地开发机器上,我将解决方案发布到文件系统(出于某种原因,我无法让IIS在这台机器上运行)。然后在服务器计算机上停止IIS,在IIS中删除“删除应用程序”,将我的文件复制到“转换为应用程序”,然后重新启动IIS。
答案 0 :(得分:0)
服务器似乎从SOAP-Client获取了错误的SOAPAction HTTP-Head属性(它是SOAP标准的一部分)。检查wsdl中的预期值(wsdl:绑定部分),并确保您使用预期值发送它。
答案 1 :(得分:0)
好的,我对这个解决方案并不完全满意,但这就是我如何使用它。
我不太了解WSDL知道为什么或如何发生这种情况,但是WSDL xml文件中包含以下几行(根据我对自己原始帖子的评论)。
<wsdl:service name="Myservice">
<wsdl:port name="MyserviceSoap" binding="tns:MyserviceSoap">
<soap:address location="http://1.2.3.4/Myservice/Myservice.asmx" />
</wsdl:port>
.
.
.
</wsdl:service>
注意缺少:8083端口的位置。最初我将服务从1.2.3.4移动到1.2.3.4:8083以便在转换期间保持运行 - 然后路由器使用NAT将其转发到内部网络上的正确服务器。当服务器的所有者说他们关闭时,他们关闭的只是那台计算机上的MS SQL服务器,所以我的旧Web服务仍在工作。 (当他们说他们已关掉服务器时,我有点接受了他们的话)
要解决此问题,我在我的PHP客户端脚本中覆盖了SoapClient类中的__doRequest()函数,以手动将:8083添加到该位置的URL。
class SoapClient8083 extends SoapClient
{
public function __doRequest($request, $location, $action, $version, $one_way = 0) {
$location_parts = explode("//", $location);
if (count($location_parts) == 2) {
$location_url_parts = explode("/", $location_parts[1]);
$location_url_parts[0] .= ":8083";
$new_location = $location_parts[0] . "//" . implode("/", $location_url_parts);
}
if (isset($new_location) && $new_location)
$location = $new_location;
return parent::__doRequest($request, $location, $action, $version, $one_way);
}
}
所以它从正确的位置获取函数列表,这就是为什么它在我删除函数时正确识别,然后联系错误的地方以实际实现函数。
... 8小时后再尝试调试......
无论如何,我宁愿不坚持这个解决方案,而是找出为什么WSDL没有将端口号放在<soap:address location... />
感谢您的回复 - 他们确实鼓励我朝着正确的方向前进......