Обработка тайм-аута HttpWebRequest
У меня действительно простой вопрос. Я загружаю файлы на сервер с помощью HTTP POST. Дело в том, что мне нужно специально обрабатывать таймауты соединений и добавлять бит алгоритма ожидания после того, как произошел перерыв в перезагрузке сервера.
Мой код довольно прост:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("SomeURI");
request.Method = "POST";
request.ContentType = "application/octet-stream";
request.KeepAlive = true;
request.Accept = "*/*";
request.Timeout = 300000;
request.AllowWriteStreamBuffering = false;
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
WebHeaderCollection headers = response.Headers;
using (Stream Answer = response.GetResponseStream())
{
// Handle.
}
}
}
catch (WebException e)
{
if (Timeout_exception)
{
//Handle timeout exception
}
}
Я пропустил код чтения файла, поскольку это не наша проблема. Теперь мне нужно убедиться, что после создания WebException я фильтрую исключение, чтобы увидеть, действительно ли это исключение тайм-аута. Я думал о сравнении с сообщением об исключении, но я не уверен, правильно ли это, так как это приложение является коммерческим приложением, и я боюсь, что сообщение меняется между разными языками. И какое сообщение я должен искать.
Любые предложения?
Ответы
Ответ 1
Вы можете посмотреть WebException.Status
. Обозначение WebExceptionStatus
имеет флаг Timeout
:
try
{
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
WebHeaderCollection headers = response.Headers;
using (Stream answer = response.GetResponseStream())
{
// Do stuff
}
}
}
catch (WebException e)
{
if (e.Status == WebExceptionStatus.Timeout)
{
// Handle timeout exception
}
else throw;
}
Использование фильтров исключений С# 6 может пригодиться здесь:
try
{
var request = WebRequest.Create("http://www.google.com");
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
WebHeaderCollection headers = response.Headers;
using (Stream answer = response.GetResponseStream())
{
// Do stuff
}
}
}
catch (WebException e) when (e.Status == WebExceptionStatus.Timeout)
{
// If we got here, it was a timeout exception.
}
Ответ 2
GetResponse()
введите a WebException
.
Смотрите это:
Если период ожидания истекает до того, как ресурс может быть возвращен, возникает WebException.
Итак, вы можете использовать:
catch(WebException e){
}
Также вы можете увидеть здесь