HttpWebRequest.BeginGetResponse выдает неожиданное исключение
Я создаю приложение для WindowsPhone 8, которое вызывает множество служб REST. Службы проверены, и все в порядке, у меня также есть некоторые журналы с моего сервера IISExpress, поскольку я здесь проверяю все на своей рабочей станции.
Моя проблема всплывает, когда я пытаюсь повторить кучу запросов PUT. Пока я тестирую, эти запросы всегда одинаковы. Первые ответы ок. Второй предназначен для ответа 401 UnAuthorized и согласно журналам, все в порядке.
2014-02-11 14:29:24 169.254.80.80 PUT /api/UserData key=2a80391882dc4a29fb4419bd70861ef9&sign=220a5962580eb5690109b2602be75b5fadf508ce9f464e4bdfae33f4520f9729&addresses=True 1476 - 169.254.127.48 NativeHost - 401 0 0 60
Проблема появляется на стороне клиента. Я получил это:
public async Task<string> httpRequest(HttpWebRequest request)
{
string received;
using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, null)))
{
if (response.StatusCode != HttpStatusCode.OK)
{
RequestFailed(request);
switch (response.StatusCode)
{
case HttpStatusCode.InternalServerError:
throw new WebException(new StreamReader(response.GetResponseStream()).ReadToEnd(), null, WebExceptionStatus.UnknownError, response);
case HttpStatusCode.Unauthorized:
this.IsAuthorizedProblem = true;
throw new WebException(new StreamReader(response.GetResponseStream()).ReadToEnd(), null, WebExceptionStatus.ProtocolError, response);
case HttpStatusCode.BadRequest:
throw new WebException(new StreamReader(response.GetResponseStream()).ReadToEnd(), null, WebExceptionStatus.ProtocolError, response);
default:
throw new WebException(new StreamReader(response.GetResponseStream()).ReadToEnd(), null, WebExceptionStatus.UnknownError, response);
}
throw new WebException(new StreamReader(response.GetResponseStream()).ReadToEnd(), null, WebExceptionStatus.UnknownError, response);
}
using (var responseStream = response.GetResponseStream())
{
using (var sr = new StreamReader(responseStream))
{
received = await sr.ReadToEndAsync();
}
}
RequestSucceded(request);
return received;
}
}
Я не могу понять, что на уровне BeginGetResponse я получил исключение с сообщением "Сервер возвращает ошибку: не найден". Большая проблема в том, что:
- Я не могу обработать статус самостоятельно, поскольку он инкапсулирован в исключение WebException, которое не знает HttpStatusCode
- Настоящая ошибка не найдена, а не авторизована. Моя программа может работать с UnAuthorized, поскольку это то, что ожидается, но эта ошибка только что обнаружена вышестоящей функцией, которая говорит: "Любая ошибка возникает, пожалуйста, повторите попытку через несколько минут".
Вот некоторая информация об исключении:
GetAddresses-> GetAuthRequest {System.Net.WebException: удаленный сервер возвратил ошибку: NotFound. ---> System.Net.WebException: удаленный сервер возвратил ошибку: NotFound. в System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) в System.Net.Browser.ClientHttpWebRequest. <> c_ DisplayClasse.b _d (объект sendState) в System.Net.Browser.Aslassb_serser. (Объект sendState) --- Конец внутренней трассировки стека исключений --- в System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Состояние объекта) в System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult). Threading.Tasks.TaskFactory
1.FromAsyncCoreLogic(IAsyncResult iar, Func
2 endFunction, Action1 endAction, Task
1 обещание, Boolean требуется синхронизация) --- Конец трассировки стека из предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification) в System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()