如何针对每个非通用请求在通用RestService中处理结果?

时间:2018-10-30 16:42:00

标签: c# rest generics exception-handling

我有一个用于以通用方式使用REST Api的接口。

public interface IRestService
{
     Task<TResult> PostAsync<TRequest, TResult, THandlerArgs>(string uri, TRequest data, EventHandler<HttpResponseMessage> resultHandler, string token = "");
}

在实践中,我很难通过这种方式弄清楚如何处理特定的异常和常规流程。我的实现如下所示:

public async Task<TResult> PostAsync<TRequest, TResult, THandlerArgs>(string uri, TRequest data, EventHandler<HttpResponseMessage> resultHandler, string token = "")
{
    string serialized = await Task.Run(() => JsonConvert.SerializeObject(data))
                                          .ConfigureAwait(false);

    HttpResponseMessage response = await _httpClient.PostAsync(uri, new StringContent(serialized, Encoding.UTF8, "application/json"))
                                                                   .ConfigureAwait(false);


    string responseData = await response.Content.ReadAsStringAsync()
                                            .ConfigureAwait(false);

    return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData));
}

我可以返回反序列化的响应,以供我的调用类使用。但是在登录过程中如何处理未授权状态代码?我可以抛出异常并将其捕获在调用方中,但是如果用户名不是真正的登录名怎么办?这不是一个例外,而是所有应用程序中的一种普遍现象。但是我看不到如何从返回的responseData中确定这一点。

我已经考虑过将方法返回类型更改为HttpResponseMessage并从调用类中检查状态代码。这样做有什么问题吗?

我还考虑过从调用对象传入自定义处理程序(请参见上面的THandlerArgs),但这对我来说似乎有点过分设计。

处理此类通用异常或标准流的非通用方法是什么?

0 个答案:

没有答案