我们在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分钟.
*编辑:我认为我正在寻找的是异步方法的实现.我会在发现令人满意的实施时更新这篇文章.
我有以下Ruby脚本:
arr = ['bob', 'jack', 'smith']
array_of_hashes = Array.new
hash = Hash.new
arr.each do |item|
hash.clear
hash[:name] = item
array_of_hashes << hash
end
puts array_of_hashes
Run Code Online (Sandbox Code Playgroud)
这将返回一个哈希数组,其中:name键全部来自最后一个元素.
[
[0] {
:name => "smith"
},
[1] {
:name => "smith"
},
[2] {
:name => "smith"
}
]
Run Code Online (Sandbox Code Playgroud)
我希望它能返回以下内容,但我不知道为什么最后一个Hash元素会覆盖所有以前的数组元素:
[
[0] {
:name => "bob"
},
[1] {
:name => "jack"
},
[2] {
:name => "smith"
}
]
Run Code Online (Sandbox Code Playgroud)
编辑:谢谢大家的回答.很高兴有一些不同的方法来完成同样的事情.我测试了每个解决方案,每个解决方案都很棒.我最终使用的是与原始代码最相似的那个; 但我的用例是一个简单的本地脚本 - 它不是在工业大小的应用程序中使用 - 在这种情况下,我可能会选择不同的解决方案.