如何防止长响应的HttpWebRequest从超时Azure Web应用程序

本文关键字:超时 Azure Web 应用程序 HttpWebRequest 何防止 响应 | 更新日期: 2023-09-27 17:51:08

我们正在使用c#中的HttpWebRequest从Azure Web应用程序中的互联网资源获取数据。问题是Azure对保持连接存活的时间(大约240秒)有限制。由于应用程序的性质,响应有时需要240秒以上的时间。当这种情况发生时,网页将变成白色,"查看源代码"将显示零源代码(这使得这个问题难以调试)。

下面是一些示例代码来说明:

        webRequest = WebRequest.Create(PAGE_URL) as HttpWebRequest;
        webRequest.Method = "POST";
        webRequest.ContentType = "application/x-www-form-urlencoded";
        webRequest.CookieContainer = cookies;
        webRequest.Timeout = Timeout.Infinite;
        webRequest.KeepAlive = true;
        StreamWriter requestWriter2 = new
            StreamWriter(webRequest.GetRequestStream());
        requestWriter2.Write(postString); 
        requestWriter2.Close();
        WebResponse response = webRequest.GetResponse();
        Stream stream = response.GetResponseStream();

添加webRequest。超时和webRequest。KeepAlive无法解决此问题。

jbq在这个线程中提到他有一个解决方案,通过发送"每5秒换行字符",但是没有解释如何完成这个任务。他是在回答一个关于Azure VM的问题,但我认为Azure Web应用程序应该有类似的行为,我认为是负责超时的负载平衡器。

问题:我怎么能发送一个HttpWebRequest,然后发送另一个HttpWebRequest ,而前一个正在运行与空白行保持连接,并防止Azure负载均衡器(?)从Azure应用程序超时?是否需要使用一个新的会话变量?也许是异步方法?我是否需要在主请求之前发送"ping"请求 ?如果是这样,在实现中会是什么样子?或者是完全不同的东西?请提供一些源代码作为示例:)

注意:你做需要使用HttpWebRequest来复制这个问题。将Visual Studio中的调试器附加到Azure Web应用程序中。在Visual Studio中的任何代码段设置断点。当到达断点时,大约4分钟后,您将看到浏览器中的页面停止加载,并显示空白的源代码。所以,它不是特别与HttpWebRequest相关,但这是一个操作,通常会导致这种问题,因为一些响应需要超过4分钟。

*编辑:我想我正在寻找的是异步方法的实现。当我找到一个满意的实现时,我会更新这篇文章。

如何防止长响应的HttpWebRequest从超时Azure Web应用程序

如果你正在制作一个HttpWebRequest到Azure网站然后你使用ServicePointManager。SetTcpKeepAlive在你的客户端代码使用HttpWebRequest.

https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.settcpkeepalive (v = vs.110) . aspx

你所说的4分钟超时是TCP层上的IDLE超时,设置这将确保你的客户端(使用HttpWebRequest)通过TCP发送ACK数据包,以便连接不会空闲。

如果你的web应用程序正在向其他服务发送HttpWebRequest,你仍然可以使用这个函数,但这将确保在调用远程服务时不会遇到空闲超时。你对Azure web应用程序的实际HTTP请求可能仍然达到4分钟的时间,如果客户端到你的Azure web应用程序不是HttpWebRequest,那么4分钟的空闲超时将再次咬住你…

这里最好的做法是稍微修改一下代码,以实现一种JOB Model模式,在这种模式中,进行一个返回JOBID的服务器调用。然后,客户端以轮询方式使用该JOBID查询服务器,当作业在服务器上完成时,该JOBID的状态可以设置为COMPLETED,在这种情况下,客户端可以检索数据。你可以在Azure Webapps中使用Webjobs来实现类似的功能。