2014-09-11 3 views
2

HttpClient를 사용하여 "SDK/Proxy"클래스를 만들고 SDK가 사용하는 서비스에서 throw 된 예외를이 SDK를 사용하는 응용 프로그램에 전달하려고합니다. 원래 예외는 변경되지 않고 보존되어야하며 래핑되지 않아야합니다. EnsureSuccessStatusCode()를 시도했지만 원래 예외가 소비자에게 유실 되었기 때문에 좋지 않습니다. 다음은 기본 서비스에서 예외를 catch하여 소비자에게 전달하려고 시도하는 SDK 코드입니다..Net HttpClient가 예외를 deserialize 할 수 없습니다.

public async Task<string> GetValue(string effect) 
{ 
    using (var client = GetHttpClient()) 
    { 
     HttpResponseMessage resp = await client.GetAsync("api/values?effect=" + effect).ConfigureAwait(false); 

     if (resp.IsSuccessStatusCode) 
     { 
      return await resp.Content.ReadAsStringAsync(); 
     } 
     throw await resp.Content.ReadAsAsync<Exception>(); 
    } 
} 

"소비자"서비스는 SDK를 사용하고 있습니다.

public async Task<string> Get(string effect) 
{ 
    return await baseSvc.GetValue(effect); 
} 

테스트 할 때 다음과 같은 응답이 표시됩니다.

{ 메시지 : "오류가 발생했습니다." ExceptionMessage : "멤버 'ClassName'을 (를) 찾을 수 없습니다." 예외 유형 : "System.Runtime.Serialization.SerializationException"...

예외를 던지는 기본 서비스 코드는 다음과 같습니다.

소비 된 서비스의 원래의 변경되지 않은 예외를 SDK를 통해 소비자에게 "플로우"시킬 수 있습니까?

답변

2

다음과 같이 사용할 수 있습니다. string responseBody = response.Content.ReadAsStringAync(). 결과; 새로운 HttpException ((int) response.StatusCode, responseBody)를 던집니다;

내가이 언급 한 - 그것은 대안을 제공하고, 내가 도움을 주셔서 감사한다는 점에서 web API and MVC exception handling

+2

이, 도움이됩니다. 그것은 내 질문에 대한 대답은 본질적으로 ApplicationException (특히)를 deserialize 할 수 있는지 여부입니다. http 호출이 이루어진 사실이 예외 인 "작업"을 변경하지 않는 경우, 예를 들어 웹 API 코드가 sqlexception을 던진 경우 SDK를 사용하는 소비자가 httpexception보다는 sqlexception을 수신하는 경우에 이상적입니다. – user1783711

관련 문제