将Web服务移动到另一台服务器时出现问题

时间:2014-07-18 10:08:53

标签: asp.net web-services iis soap wsdl

我有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。

2 个答案:

答案 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... />

感谢您的回复 - 他们确实鼓励我朝着正确的方向前进......