requests 超时关闭,如何终止在C#中的HttpWebRequest连接?它不工作,即使设置超时或readwritetimeout...

这篇博客讨论了在使用HttpWebRequest进行HTTP请求时遇到的长时间无响应问题。作者设置了超时时间为5秒,但在某些情况下,连接可能需要15分钟才能接收到不完整的响应。问题在于,尽管超时设置有效,但在尝试关闭流时线程会挂起。解决方案是,在关闭流之前调用HttpWebRequest的Abort方法来中断请求,避免挂起。这样可以确保连接在超时时被正确终止。
摘要由CSDN通过智能技术生成

I want to terminate a httpwebrequest when it takes too long time in connection.

Here is just a simaple code that I wrote:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);

request.Timeout = 5000;

request.ReadWriteTimeout = 5000;

request.Proxy = new WebProxy("http://" + proxyUsed + "/", true);

request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.01; Windows NT 5.0)";

using (WebResponse myResponse = request.GetResponse())

{

using (Stream s = myResponse.GetResponseStream())

{

s.ReadTimeout = 5000;

s.WriteTimeout = 5000;

using (StreamReader sr = new StreamReader(s, System.Text.Encoding.UTF8))

{

result = sr.ReadToEnd();

httpLink = myResponse.ResponseUri.AbsoluteUri;

sr.Close();

}

s.Close();

}

myResponse.Close();

}

However, sometimes the connection will take a about 15minutes to get the response.

The situation is after 15minutes I still can get the response but not the full source code of the URL.

I guess that the connection is too slow that the URL response me a bit data within the timeout, just say for example receive 1byte in 5seconds, so it doesn't expire the timoue but it's very long.

How can I terminate the connection?

Thanks:)

解决方案

You might find that the timeout is actually working, but the thread hangs when trying to close the stream. I don't know why it happens, but sometimes it does. I've never used ReadToEnd, but I've run across this when using Read.

I fixed the problem by calling Abort on the request, before I close the stream. It's a bit of a kluge, but it's effective. The abbreviated code below shows the technique.

HttpWebResponse response = null;

StreamReader sr = null;

try

{

response = (HttpWebResponse)request.GetResponse(...);

Stream s = response.GetResponseStream();

sr = new StreamReader(s, Encoding.UTF8);

// do your reading here

}

finally

{

request.Abort(); // !! Yes, abort the request

if (sr != null)

sr.Dispose();

if (response != null)

response.Close();

}

What I've found is that the ReadTimeout and ReadWriteTimeout work as expected. That is, when the read times out, execution really does go to the finally block. And if the request.Abort isn't there, the call to sr.Dispose will hang.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值