【问题标题】:Problems moving an web service to another server将 Web 服务移动到另一台服务器时出现问题
【发布时间】:2014-07-18 10:08:52
【问题描述】:

我有 C#/ASP.NET Web 服务,它在远程服务器上运行并使用 WSDL。直到最近它被移动到另一台服务器时,它才能正常工作。然而,这意味着我必须更改硬编码的数据库连接字符串,因此需要在我的开发机器上重新构建代码并上传到服务器。

服务是从运行在另一个使用 SOAP 的 Web 服务器上的 PHP 脚本调用的。

出于某种原因,据我所知,它正在尝试运行旧代码,即使我已经对其进行了修改。

例如如果我将我的 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。

【问题讨论】:

  • 您认为客户端是在与旧服务器通信还是在新服务器上与旧版本通信?对我来说听起来像是旧服务器。
  • 由于某种原因,您的 PHP 客户端正在与旧服务器通信。尝试关闭旧服务器(或从中删除 Web 服务),看看客户端是否出现错误。
  • @Rhumborl 我不这么认为 - 正如我所说,如果我在新服务器上关闭 IIS,客户端根本无法访问该服务,如果我打开 Web 服务,但是从中删除一个方法,它会识别出该方法现在已经消失了。 (即找不到的错误)
  • 好的,这里有个线索:当我滚动到 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> 注意:1.2.3.4 不是 1.2.3.4:8083 - 不知道为什么会这样,但是 1.2.3.4 (没有:8083)是旧服务的地址,我今天才发现它仍在运行 - 它只是关闭了数据库!

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


【解决方案1】:

服务器似乎从您的 SOAP-Client 获得了错误的 SOAPAction HTTP-Head 属性(它是 SOAP 标准的一部分)。检查 wsdl 中的预期值(wsdl:binding 部分),并确保您发送的是预期值。

【讨论】:

    【解决方案2】:

    好的,我对这个解决方案并不完全满意,但这就是我的工作方式。

    我对 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 没有将端口号放在 &lt;soap:address location... /&gt;

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多