WebRequest - .timeout问题

时间:2011-08-23 20:50:58

标签: c# http timeout webrequest

如需更多背景信息,请参阅:Problem with C# HTTP PUT request code

我使用C#WebRequest方法将文件上传到S3。我已经有一个预先签名的URL,S3正在为我上传。我最初有一个问题,如果我上传一个大文件,转移将在启动后几分钟停止。对我的另一篇文章的评论说,导致它的是.timeout。果然是。

我的问题是:我应该将.timeout设置为什么,或者如何根据我要传输的文件大小来计算设置的内容?

当我只是要向S3发送一个小文件时,我不希望启动一个60分钟超时的WebRequest,但是我也可以将一个千兆字节的文件上传到S3如果在文件完成之前超时结束,则传输将被中断。

另外我如何捕获连接超时?同时也会使用.timeout吗?如果我只想尝试连接30秒以查看S3是否响应我的网络PUT请求,如果不响应,那么该怎么办呢?

我的代码是:

WebRequest request = WebRequest.Create(PUT_URL_FINAL[0]);
//PUT_URL_FINAL IS THE PRE-SIGNED AMAZON S3 URL THAT I AM SENDING THE FILE TO

request.Timeout = 360000; //6 minutes -- If the transfer is over 6 minutes, it stops.

request.Method = "PUT";

//result3 is the filename that I am sending                                     
request.ContentType =
    MimeType(GlobalClass.AppDir + Path.DirectorySeparatorChar + "unzip" +
             Path.DirectorySeparatorChar +
             System.Web.HttpUtility.UrlEncode(result3));

byte[] byteArray =
    File.ReadAllBytes(
        GlobalClass.AppDir + Path.DirectorySeparatorChar + "unzip" +
        Path.DirectorySeparatorChar +
        System.Web.HttpUtility.UrlEncode(result3));

request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();

dataStream.Write(byteArray, 0, byteArray.Length); 

dataStream.Close();

//This will return "OK" if successful.
WebResponse response = request.GetResponse();
Console.WriteLine("++ HttpWebResponse: " +
                  ((HttpWebResponse)response).StatusDescription);

1 个答案:

答案 0 :(得分:1)

您可以尝试根据文件大小计算超时 - 但这样做意味着您必须知道或估计某些传输速度......

另一个选择是在通常情况下选择“可接受”的超时,然后在以“标准超时”的两倍或十倍的速度重试异常时...