如何使用超时Azure Web App

时间:2015-05-30 02:16:02

标签: c# asp.net azure azure-web-sites visual-studio-2015

我们在C#中使用HttpWebRequest从Azure Web App中的Internet资源获取数据。问题是Azure对连接保持活动的时间有限(around 240 seconds)。由于我们的应用程序的性质,响应有时需要超过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没有解决问题。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

如果要对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,您仍然可以使用此功能,但这只会确保在调用远程服务时不会触发空闲超时。您对Azure Webapp的实际HTTP请求可能仍会达到4分钟的时间,如果您的Azure Web应用程序的客户端不是HttpWebRequest,那么4分钟的空闲超时将再次让您感到...

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

希望这会有所帮助......