我在C#中编写了一个Windows服务,它通过外部Web服务调用(SOAP)与第三方连接。有些电话响应很快,有些电话慢慢响应
(例如,quick =检索货币列表; slow =检索多年来每种产品的货币历史值)
当我在本地计算机上运行外部服务时工作正常 - 快速调用运行大约20秒;慢速呼叫持续约30分钟。我无法对第三方服务的速度做任何事情,我也不介意回复答案所花的时间..
我的问题是,当我将我的服务部署到我的Azure虚拟机时:快速调用的工作方式与本地操作完全相同;缓慢的只是永远不会返回任何东西。我已经尝试过异常处理,记录到文件,记录到eventLog。
没有明确的迹象表明出现了什么问题 - 似乎无论出于何种原因 - 长时间运行的Web服务调用,都不会成功返回Azure。
我已经在某个地方读过每4分钟发生一次连接回收的事情,我怀疑它会以某种方式导致外部Web服务响应在负载平衡器或其他任何不知道的情况下出现在虚空中再请求内容的人。
我首先使用相关的SOAP信封创建请求,如下所示:
HttpWebRequest tRequest = (HttpWebRequest)WebRequest.Create(endpoint);
然后我设置了这些东西:
tRequest.ClientCertificates.Add(clientCertificate);
tRequest.PreAuthenticate = true;
tRequest.KeepAlive = true;
tRequest.Credentials = CredentialCache.DefaultCredentials;
tRequest.ContentLength = byteArray.Length;
tRequest.ContentType = @"text/xml; charset=utf-8";
tRequest.Headers.Add("SOAPAction", @"http://schemas.xmlsoap.org/soap/envelope/");
tRequest.Method = "POST";
tRequest.Timeout = 3600000;
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; //the SSL certificate is bad
Stream requestStream = tRequest.GetRequestStream();
requestStream.Write(byteArray, 0, byteArray.Length);
requestStream.Close();
requestStream.Dispose(); //works fine up to this point.
WebResponse webResponse = tRequest.GetResponse(); //The slow calls never make it past this. Fast one does
其他人经历过类似的事情,有什么建议可以解决吗?
非常感谢
答案 0 :(得分:1)
当您部署到Azure(云服务,虚拟机)时,始终存在Azure负载均衡器,它位于您的VM和Internet之间。
为了使所有云用户均可使用资源,Azure Load Balancer将终止空闲连接。 Azure LB的空闲状态 - 默认为4分钟没有通过已建立的通道发送通信。因此,如果你打电话给一个网络服务,并且4分钟内pip上没有任何响应 - 你的连接将被终止。
你可以配置这个超时,但我真的认为需要长时间保持连接打开。是的,除了寻找具有更好设计的服务(即更快地返回响应,或者实现异步调用,其中第一次调用服务只会给你一个任务id,你可以定期轮询)时,你无能为力得到一个结果)
Here is a good article on how to configure the Azure Load Balancer timeout。请注意,Azure LB的最大超时为30分钟。