sin*_*ity 5 c# asp.net azure azure-web-sites visual-studio-2015
我们在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();
Run Code Online (Sandbox Code Playgroud)
添加webRequest.Timeout和webRequest.KeepAlive没有解决问题.
jbq在这个帖子中提到他通过每隔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。
您所说的 4 分钟超时是TCP 层上的空闲超时,设置此超时将确保您的客户端(正在使用 HttpWebRequest)通过 TCP 发送 ACK 数据包,以便连接不会空闲。
如果您的 Web 应用程序正在向其他服务发出 HttpWebRequest,您仍然可以使用此函数,但这只是确保在调用远程服务时不会达到空闲超时。您对 Azure Web 应用程序的实际 HTTP 请求可能仍会达到 4 分钟时间,并且如果您的 Azure Web 应用程序的客户端不是 HttpWebRequest,那么 4 分钟的空闲超时将再次困扰您......
这里最好的做法是稍微更改代码以实现 JOB 模型类型的模式,其中您进行返回 JOBID 的服务器调用。然后,客户端以轮询方式使用此 JOBID 查询服务器,当作业在服务器上完成时,此 JOBID 的状态可以设置为“已完成”,在这种情况下,客户端可以检索数据。您可以使用 Azure Webapps 中的 Webjobs 来实现类似的目的。
希望这可以帮助...