我们在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分钟。
*编辑:我认为我正在寻找的是异步方法的实现。我会在发现令人满意的实施时更新这篇文章。
答案 0 :(得分:1)
如果要对Azure网站进行 HttpWebRequest ,则在使用HttpWebRequest的客户端代码上使用ServicePointManager.SetTcpKeepAlive。
您正在谈论的4分钟超时是TCP层上的 IDLE超时,并且这将确保您的客户端(使用HttpWebRequest)通过TCP发送ACK数据包以便连接不会闲着。
如果您的Web应用程序正在向其他服务发出HttpWebRequest,您仍然可以使用此功能,但这只会确保在调用远程服务时不会触发空闲超时。您对Azure Webapp的实际HTTP请求可能仍会达到4分钟的时间,如果您的Azure Web应用程序的客户端不是HttpWebRequest,那么4分钟的空闲超时将再次让您感到...
这里要做的最好的事情是更改代码以实现JOB模型的模式,在这里你进行服务器调用,返回一个JOBID。然后,客户端以轮询方式使用此JOBID查询服务器,并且当作业在服务器上完成时,此JOBID的状态可以设置为COMPLETED,在这种情况下,客户端可以检索数据。您可以在Azure Webapps中使用Webjobs来实现这样的目标。
希望这会有所帮助......