我有一个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就不再发生了。
答案 0 :(得分:-1)
部署Windows Azure应用程序的Windows Azure数据中心区域可能不在外部Web服务附近。您正在尝试的本地计算机(工作正常)可能接近Web服务。这就是为什么Azure中可能存在巨大的延迟,这可能会导致它失败。
从Azure VM中的浏览器访问WSDL的成功可能是由于浏览器缓存。从浏览器进行函数调用会告诉您它是否实际建立连接。
答案 1 :(得分:-1)
我们找到了一个解决方案来解决这个问题,尽管我并不完全满意。在耗尽所有其他操作后,我们将负载均衡器从第4层负载均衡更改为第7层负载均衡。虽然这解决了丢失请求的问题,但我不确定为什么这会产生影响。