【问题标题】:WebRequest - .timeout questionWebRequest - .timeout 问题
【发布时间】:2011-11-02 07:12:39
【问题描述】:

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

我正在使用 C# WebRequest 方法将文件上传到 S3。我已经有一个 S3 为我上传的预签名 URL。我最初有一个问题,如果我上传一个大文件,传输会在开始后几分钟停止。对我的另一篇文章的评论说是 .timeout 造成的。果然是。

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

当我只想将一个小文件发送到 S3 时,我不想启动一个 60 分钟超时的 WebRequest,但是我也可以将一个千兆字节的文件也上传到 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);

【问题讨论】:

  • 顺便说一句,您的 StreamWebResponse 对象需要在 using 块内。

标签: c# http timeout webrequest


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-14
    • 2011-11-17
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多