C# Azure长期运行的外部web服务调用

C# Azure长期运行的外部web服务调用,c#,web-services,azure,soap,C#,Web Services,Azure,Soap,我用C语言编写了一个windows服务,它通过外部web服务调用(SOAP)与第三方进行接口。有些电话反应迅速,有些则反应缓慢 (例如,quick=检索货币列表;slow=检索每种产品多年来的货币历史值) 当我在本地机器上运行外部服务时,它工作得很好-快速呼叫运行大约20秒;慢速通话持续约30分钟。我对第三方服务的速度无能为力,我也不介意回复回复所需的时间 我的问题是,当我将我的服务部署到Azure虚拟机时:快速调用与本地调用完全相同;慢吞吞的人什么也不回。我尝试过异常处理、记录到文件、记录到事

我用C语言编写了一个windows服务,它通过外部web服务调用(SOAP)与第三方进行接口。有些电话反应迅速,有些则反应缓慢

(例如,quick=检索货币列表;slow=检索每种产品多年来的货币历史值)

当我在本地机器上运行外部服务时,它工作得很好-快速呼叫运行大约20秒;慢速通话持续约30分钟。我对第三方服务的速度无能为力,我也不介意回复回复所需的时间

我的问题是,当我将我的服务部署到Azure虚拟机时:快速调用与本地调用完全相同;慢吞吞的人什么也不回。我尝试过异常处理、记录到文件、记录到事件日志

目前还没有明确的迹象表明出了什么问题——似乎出于任何原因——长期运行的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
然后我设置了一些东西,如下所示:

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
还有其他人经历过类似的事情吗?有什么建议可以解决吗

非常感谢

当您部署到Azure(云服务、虚拟机)时,总会有Azure负载平衡器,它位于您的虚拟机和Internet之间

为了让所有云用户都能平等地使用资源,Azure负载平衡器将终止空闲连接。Azure LB的空闲时间-默认为4分钟,没有通过已建立的通道发送通信。因此,如果您调用web服务,并且pip上的响应持续4分钟,那么您的连接将被终止

您可以配置此超时,但我认为需要保持连接打开那么长时间。是的,除了寻找设计更好的服务(即更快地返回响应,或者实现异步调用,其中对服务的第一次调用只会给您一个任务id,您可以使用该id定期轮询以获得结果)之外,您对此无能为力


。请注意,Azure LB的最大超时为30分钟

谢谢你的反馈