Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止具有长响应的HttpWebRequest超时Azure Web应用程序_C#_Asp.net_Azure_Azure Web App Service_Visual Studio 2015 - Fatal编程技术网

C# 如何防止具有长响应的HttpWebRequest超时Azure Web应用程序

C# 如何防止具有长响应的HttpWebRequest超时Azure Web应用程序,c#,asp.net,azure,azure-web-app-service,visual-studio-2015,C#,Asp.net,Azure,Azure Web App Service,Visual Studio 2015,我们正在使用C#中的HttpWebRequest从Azure Web应用程序中的internet资源获取数据。问题是Azure对保持连接活动的时间有限制()。由于应用程序的性质,响应时间有时会超过240秒。发生这种情况时,网页将变为白色,“查看源代码”将显示零源代码(这使得此问题难以调试) 下面是一些示例代码来说明: webRequest = WebRequest.Create(PAGE_URL) as HttpWebRequest; webRequest.Met

我们正在使用C#中的HttpWebRequest从Azure Web应用程序中的internet资源获取数据。问题是Azure对保持连接活动的时间有限制()。由于应用程序的性质,响应时间有时会超过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 on提到他有一个变通办法,每5秒发送一个换行符,但是没有解释如何准确地完成这一点。他回答了一个关于Azure VM的问题,但我认为Azure Web应用程序也会有类似的行为,我认为是负载平衡器造成了超时

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

注意:您不需要使用HttpWebRequest来复制此问题。将Visual Studio中的调试器附加到live Azure Web应用程序。在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分钟的空闲超时将再次影响您

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


希望这能有所帮助……

如果你有一个需要很长时间才能返回的请求,请尝试将其转换为异步web请求。哈哈@ZainRizvi疯狂巧合,我刚刚更新了我的帖子,根据我所阅读的信息,异步web请求将是最有可能的解决方案。谢谢你的评论。