如何使用超时Azure Web App的长响应来防止HttpWebRequest

我们在C#中使用HttpWebRequest从Azure Web App中的Internet资源获取数据。 问题是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.Timeout和webRequest.KeepAlive没有解决问题。

jbq在这个post中提到他通过每5秒发送一个“换行符”来解决这个问题,但是没有解释如何完成这个。 他正在回答有关Azure VM的问题,但我认为Azure Web App在我认为负责超时的负载均衡器方面会有类似的行为。

问题:我如何发送一个HttpWebRequest,然后发送另一个HttpWebRequest, 而前一个 HttpWebRequest使用空行运行以维持连接并阻止Azure负载均衡器(?)超时蔚蓝应用程序? 是否需要使用新的会话变量? 也许是异步方法? 我是否需要在主要请求之前发送“pinging”请求? 如果是这样,这将如何实现? 或者它完全是另一回事? 请提供一些源代码作为示例:)

注意:您不需要使用HttpWebRequest来复制此问题。 将Visual Studio中的调试器附加到实时Azure Web App。 在Visual Studio中的任何代码段放置一个断点。 当该断点被击中时,大约4分钟后,您将看到浏览器中的页面停止加载并变为空白源。 因此,它与HttpWebRequest没有特别的关系,但这是一种通常会导致此类问题的操作,因为某些响应需要超过4分钟。

*编辑:我认为我正在寻找的是异步方法的实现。 我会在发现令人满意的实施时更新这篇文章。

如果您正在对Azure网站进行HttpWebRequest,那么您在使用HttpWebRequest的客户端代码上使用ServicePointManager.SetTcpKeepAlive。

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

您正在谈论的4分钟超时是TCP层上的IDLE超时 ,并且这将确保您的客户端(使用HttpWebRequest)通过TCP发送ACK数据包,以便连接不会空闲。

如果您的Web应用程序正在向其他服务发出HttpWebRequest,您仍然可以使用此function,但这只会确保在调用远程服务时不会触发空闲超时。 您对Azure Webapp的实际HTTP请求可能仍会达到4分钟时间,如果您的Azure Web应用程序的客户端不是HttpWebRequest,那么4分钟的空闲超时将会让您感到困惑……

这里要做的最好的事情是更改代码以实现JOB模型类型的模式,在其中进行服务器调用,返回JOBID。 然后,客户端以轮询方式使用此JOBID查询服务器,并且当作业在服务器上完成时,此JOBID的状态可以设置为COMPLETED,在这种情况下,客户端可以检索数据。 您可以在Azure Webapps中使用Webjobs来实现这样的function。

希望这可以帮助…