2016-09-12 3 views
0

Я вызываю веб-службу асинхронно с использованием HttpClient и обрабатываю ответ с помощью ContinueWith. В этом случае я хочу проверить HttpStatusCode и выбросить исключение, если это не 200 (успех).Выбросить исключение в пределах ContinueWith block

Мой код выглядит следующим образом:

// Call the GetAddress service passing in the postcode 
var task = client.GetAsync(url) 
    .ContinueWith((taskWithResponse) => 
    {      
     var response = taskWithResponse.Result; 
     ValidateResponse(response.StatusCode); 
     var jsonString = response.Content.ReadAsStringAsync(); 
     jsonString.Wait(); 
     model = JsonConvert.DeserializeObject<GetAddressResults>(jsonString.Result); 
      }); 
task.Wait(); 

private static void ValidateResponse(HttpStatusCode statusCode) 
{ 
    Exception exception = null; 
    switch(statusCode) 
    { 
     case HttpStatusCode.NotFound: 
      exception = new NotFoundException(); 
      break; 
     case HttpStatusCode.BadRequest: 
      exception = new InvalidException(); 
      break; 
     case HttpStatusCode.Forbidden: 
      exception = new ForbiddenException(); 
      break; 
     case (System.Net.HttpStatusCode)429: 
      exception = new ExceededLimitException(); 
      break; 
     default: 
      return; 
    } 

    throw exception; 
} 

Однако при выполнении этого вместо того, чтобы вернуть одно из исключений я указал это вместо того, чтобы пойманы task.Wait(), который бросает и AggregateException.

Есть ли способ заставить задачу выбросить исключение, которое я изначально хотел, или мне нужно поставить try/catch вокруг метода Wait() и вытащить мой тип исключения?

+4

* Я асинхронно звоню в веб-службу *. Нет, вы используете 'task.Wait()', вы * синхронно блокируете *. Любая причина, по которой вы не используете async-wait? –

+2

Исключение AggregateException будет содержать любые исключения, занесенные в его свойство InnerExceptions – stuartd

+0

Хотя это не отвечает на ваш вопрос, есть одна драматическая вещь об этом коде - метод 'ValidateResponse'. Это утверждение 'switch' ужасно - читайте о фабриках, это шаблон, используемый для обработки подобных ситуаций. –

ответ

2

Вы вызываете веб-службу синхронно. Используйте await/async ключевые слова вместо:

try 
{ 
    var response = await client.GetAsync(url); 
    ValidateResponse(response.StatusCode); 
    var jsonString = await response.Content.ReadAsStringAsync(); 
    model = JsonConvert.DeserializeObject<GetAddressResults>(jsonString); 
} 
catch (NotFoundException e) 
{ 
    // ... 
} 
catch (ForbiddenException e) 
{ 
    // ... 
} 
... 

Если вы не можете использовать эти ключевые слова (Может быть, в Visual Studio 2010), просто поймать AggregateException и проверить это свойство InnerExceptions.