WebRequest - .timeout вопрос - PullRequest
       21

WebRequest - .timeout вопрос

1 голос
/ 24 августа 2011

Для получения дополнительной информации см. Проблема с кодом запроса PUT HTTP C #

Я использую метод C # WebRequest для загрузки файла в S3.У меня уже есть предварительно подписанный URL, который S3 дает мне для загрузки.У меня изначально была проблема, когда при загрузке большого файла передача остановилась бы через несколько минут после запуска.Комментарий к моему другому сообщению сказал, что это был .timeout, который вызывал это.Конечно же, это так.

У меня такой вопрос: что я должен установить .timeout или как я могу рассчитать, что установить, исходя из размера файла, который я собираюсь передать?

Я не хочу запускать WebRequest с 60-минутным тайм-аутом, когда я только собираюсь отправить небольшой файл на S3, но, опять же, я также мог бы также загружать гигабайтный файл на S3, и еслитайм-аут истекает до того, как файл завершен, передача будет прервана.

Кроме того, как перехватить время ожидания соединения?Будет ли .time для этого также?Что делать, если я только хочу попробовать соединение в течение 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 Ответ

1 голос
/ 24 августа 2011

вы можете попытаться рассчитать тайм-аут в зависимости от размера вашего файла - но сделать это означает, что вы должны знать или оценить некоторую скорость передачи ...

Другой вариант - выбрать тайм-аут в «приемлемом»«для обычных случаев, а затем при получении исключения повторяется с двойным или десятикратным« стандартным таймаутом »...

...