Azure Web角色无法访问外部Web服务

时间:2012-02-28 15:41:34

标签: c# .net wcf web-services azure

我有一个Azure Web角色,可以访问基于外部WCF的SOAP Web服务(端口80)以获取各种数据位。这项服务的反应非常不稳定。我经常收到以下错误。

  

没有终点收听   http://www.myexternalservice.com/service.svc可以接受该消息。这是   通常由不正确的地址或SOAP操作引起。

为了隔离问题,我创建了一个简单的控制台应用程序,以1秒的间隔重复调用此服务并记录所有响应。

    using (var svc = new MyExternalService())
    {
        stopwatch.Start();
        var response = svc.CallService();
        stopwatch.Stop();
        Log(response, stopwatch.ElapsedMilliseconds);    
    } 

如果我RDP到我的一个Azure网络实例并运行此应用程序,则需要10到20次尝试才能从外部服务获得有效响应。这些第一次尝试总是伴随着上述错误。经过这个“热身期”,它运行良好。如果我停止应用程序然后立即重新启动,则必须返回相同的“预热”期。

然而,如果我从任何其他计算机运行此相同的应用程序,我会立即收到有效的回复。我在运行于多个数据中心(非Azure)的服务器,不同网络上的桌面等上运行此记录器应用程序......这些测试运行始终非常稳定。

我不确定为什么此服务会在Azure环境中以这种方式做出反应。不幸的是,从短期来看,我被迫拨打这项服务,但我的用户不能容忍这种不一致。

在遇到连接错误的同一时间内,Azure服务器上的网络流量捕获以10秒的间隔显示大量 SynReTransmit 。一旦“预热”完成,SynReTransmit就不再发生了。

2 个答案:

答案 0 :(得分:-1)

部署Windows Azure应用程序的Windows Azure数据中心区域可能不在外部Web服务附近。您正在尝试的本地计算机(工作正常)可能接近Web服务。这就是为什么Azure中可能存在巨大的延迟,这可能会导致它失败。

从Azure VM中的浏览器访问WSDL的成功可能是由于浏览器缓存。从浏览器进行函数调用会告诉您它是否实际建立连接。

答案 1 :(得分:-1)

我们找到了一个解决方案来解决这个问题,尽管我并不完全满意。在耗尽所有其他操作后,我们将负载均衡器从第4层负载均衡更改为第7层负载均衡。虽然这解决了丢失请求的问题,但我不确定为什么这会产生影响。