2011-08-23 64 views
1

对于一个小的更多背景,请访问:Problem with C# HTTP PUT request code的WebRequest - .timeout问题

我现在用的是C#WebRequest的方法将文件上传到S3。我已经有了一个预先签名的URL,S3正在给我上传。我原本遇到了一个问题,如果我正在上传一个大文件,转移将在开始后几分钟停止。对我的其他帖子发表评论说,这是造成它的时间。果然如此。

我的问题是这样的:我应该根据我要传输的文件的大小来设置.timeout或我该如何计算要设置它的内容?

我不想以60分钟的超时时间启动WebRequest,因为我只是要将一个小文件发送到S3,但是我又可以将一个千兆字节文件上传到S3,并且如果超时时间结束在文件完成之前,传输将被中断。

另外我怎么会陷阱连接超时? .timeout会被用于这个吗?如果我只想尝试连接30秒以查看S3是否响应了我的Web 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); 
+0

顺便说一下,您的“Stream”和“WebResponse”对象需要在'使用'区块内。 –

回答

1

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

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