gpt4 book ai didi

c# - 如何防止 HttpWebRequest 因 Azure Web App 超时而响应过长

转载 作者:太空狗 更新时间:2023-10-29 23:44:52 28 4
gpt4 key购买 nike

我们使用 C# 中的 HttpWebRequest 从 Azure Web 应用程序中的互联网资源获取数据。问题在于 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 并没有解决问题。

jbq this thread提到他有一个解决方法,即“每 5 秒发送一个换行符”,但没有解释如何具体实现这一点。他正在回答有关 Azure VM 的问题,但我认为 Azure Web 应用程序对于造成超时的负载均衡器也会有类似的行为。

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

注意:您不需要需要使用 HttpWebRequest 来复制此问题。将 Visual Studio 中的调试器附加到实时 Azure Web 应用程序。在 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,您仍然可以使用此函数,但这只是确保在调用远程服务时不会达到空闲超时。您对 Azure Web 应用程序的实际 HTTP 请求可能仍会达到 4 分钟时间,如果您的 Azure Web 应用程序的客户端不是 HttpWebRequest,那么 4 分钟的空闲超时将再次困扰您...

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

希望这有帮助...

关于c# - 如何防止 HttpWebRequest 因 Azure Web App 超时而响应过长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30541531/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com