.Net HttpClient无法反序列化异常

时间:2014-09-11 15:00:00

标签: deserialization dotnet-httpclient

我正在使用HttpClient创建一个“SDK / Proxy”类,并且希望将SDK正在使用的服务抛出的异常传递给使用此SDK的应用程序。原始异常需要保持不变且不包装。我已经尝试过EnsureSuccessStatusCode(),但这并不好,因为消费者会丢失原始异常。 下面是试图从基本服务捕获异常并将其传递给消费者的SDK代码;

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'。“   ExceptionType:“System.Runtime.Serialization.SerializationException”...

抛出异常的基本服务代码就是这个;

public async Task<string> Get(string effect)
{
    switch (effect.ToLower())
    {
        case "string":
            return "this is a string";
        case "exception":
            throw new ApplicationException("this is an application exception.");
        default:
            return "effect requested does not exist.";
    }
}

是否可以通过SDK将消费者服务中的原始未更改的异常“流”到消费者身上?

1 个答案:

答案 0 :(得分:2)

您可以使用以下内容。  string responseBody = response.Content.ReadAsStringAync()。Result;             抛出新的HttpException((int)response.StatusCode,responseBody);

我已经提到了这个 - web API and MVC exception handling