为什么HttpWebRequest即使在传输过程中也会超时?

时间:2013-11-29 11:46:39

标签: c# .net upload timeout httpwebrequest

我们遇到与Alexander Sun in his question at MSDN相同的错误,当上传时间超过HttpWebRequest.Timeout中指定的时间时中止 - 这是一种意外情况。我们认为类似于在论坛中写道的gouravmukherjee:

  

我想说的是.net框架似乎在默认超时期限后关闭了连接。我并不是说我需要更改此超时,我的观点是,当客户端仍在发送数据时,为什么请求超时或取消。我可以理解,当连接空闲时可能会发生超时,但如果有数据传输正在进行,则不应强行停止。

他在后来的帖子中也走得更远:

  

我和MS谈过这个问题,并且被告知如果上传时间太长,这个超时应该会让线程不再挂起。 .net显然不关心套接字上的活动,只关心超时。这就是上传文件的原因。

     

我觉得这是一个错误,框架不关心套接字上的活动,您怎么看?

我们的测试代码非常简单:

string uri = "http://192.168.2.4:8080";
HttpWebRequest request = HttpWebRequest.CreateDefault(new Uri(uri)) as HttpWebRequest;
request.Method = "POST";
var bytes = Encoding.UTF8.GetBytes("Test content\n");
int repeat = 500000; // upload much data to take longer than request.Timeout
request.ContentLength = bytes.Length * repeat;
request.Timeout = 1000; // 1 second
var stream = request.GetRequestStream();
for (int i = 0; i < repeat; ++i)
    stream.Write(bytes, 0, bytes.Length); //exception is thrown here
stream.Close();
var response = request.GetResponse();

这会导致以下异常:

Unhandled Exception: System.Net.WebException: The request was aborted: The request was canceled.
    at System.Net.ConnectStream.InternalWrite(Boolean async, Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
    at System.Net.ConnectStream.Write(Byte[] buffer, Int32 offset, Int32 size)
    at httptest.MainClass.Main(String[] args) in c:\Users\work\Desktop\httptest\httptest\Program.cs:line 27

有趣的是,错误只发生在Microsoft Runtime上。使用Mono时,一切都按预期工作:写入流时,停止超时测量。

我们想知道如何在Microsoft运行时解决此问题。将Timeout设置为无穷大可以吗?我们觉得这不是一个好选择。或者没有其他方法可以切换到异步实现。由于我们无论如何都在单独的线程上运行,我们更喜欢简单的同步API。

2 个答案:

答案 0 :(得分:4)

更新,因为这个问题已经开放了很长时间。我们从未找到原始问题的答案(为什么超时发生)。我们认为这是Microsoft Runtime中的一个错误。

我们没有找到解决超时问题的方法,而是切换到HttpWebRequest的异步API,并自己实现超时机制。仅在等待BeginGetRequestStreamBeginGetResponse方法完成时才应用自定义超时。执行实际上载或下载时不会应用超时。我们的超时实现基于此MSDN示例代码:http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.abort(v=vs.110).aspx

答案 1 :(得分:0)

你应该看一下.ReadWriteTimout,尝试设置该值以查看是否得到了你想要的结果。

干杯!