gpt4 book ai didi

asp.net-web-api - 处理来自键入的Web API HttpClient调用的错误

转载 作者:行者123 更新时间:2023-12-03 07:43:29 25 4
gpt4 key购买 nike

我对webapi客户端进行了多次调用,这些调用返回了Task
像这样的东西

public async Task<TResp> GetMyThingAsync(TReq req)
{
using (HttpClient client = new HttpClient())
{
client.BaseAddress = new Uri(BaseURI);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/xml"));

await HttpRuntime.Cache.GetToken().ContinueWith((t) =>
{
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("XXX", t.Result);
});

var httpResponseMessage = await client.PostAsXmlAsync<TReq>("This/That/", req);
httpResponseMessage.EnsureSuccessStatusCode();
var resp = await httpResponseMessage.Content.ReadAsAsync<TResp>();
return resp;
}
}

对api的调用当然可以返回500或其他问题。 EnsureSuccessStatusCode()显然会在发生类似情况时抛出该错误,但是对于响应中的任何信息执行任何操作为时已晚。
有没有解决这个问题的好方法?
我了解您可以在客户端添加messageHandler,例如 HttpClient client = HttpClientFactory(new ErrorMessageHandler()) ..
var customHandler = new ErrorMessageHandler()
{ InnerHandler = new HttpClientHandler()};
HttpClient client = new HttpClient(customHandler);

这是要走的路吗? ErroMessageHandler的外观将如何,并向调用 Controller 返回有用的东西...?

非常感谢

t

最佳答案

创建自定义处理程序可能是记录异常或验证响应的理想解决方案。我不确定如果遇到异常,被调用的 Controller 是否正在等待客户端的有意义的响应。我认为真正重要的部分是确保您(客户端)妥善处理Web api错误。

这可以通过以下两种方式完成:

  • 您可以在调用方法内部本地处理异常。您可以使用HttpResponseMessage.IsSuccessStatusCode属性来指示是否返回了错误响应,而不是调用引发异常的httpResponseMessage.EnsureSuccessStatusCode()并返回自定义ErrorResponse(或执行您决定的任何操作):
    var client = new HttpClient() // No need to dispose HttpClient

    client.BaseAddress = new Uri(BaseURI);
    client.DefaultRequestHeaders.Accept.Clear();

    client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
    client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/xml"));

    var token = await HttpRuntime.Cache.GetToken();
    client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("XXX", token);

    var httpResponseMessage = await client.PostAsXmlAsync<TReq>("This/That/", req);
    if (!httpResponseMessage.IsSuccessStatusCode)
    {
    return Task.FromResult(new ErrorResponse()) // Create some kind of error response to indicate failure
    }

    var resp = await httpResponseMessage.Content.ReadAsAsync<TResp>();
    return resp;
  • 创建一个ErrorLoggingHandler,它可以记录从Web api接收到的异常(或执行其他操作):
    public class ErrorLoggingHandler : DelegatingHandler
    {
    private readonly StreamWriter _writer; // As a sample, log to a StreamWriter

    public ErrorLoggingHandler(Stream stream)
    {
    _writer = new StreamWriter(stream);
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
    var response = await base.SendAsync(request, cancellationToken);

    if (!response.IsSuccessStatusCode)
    {
    // This would probably be replaced with real error
    // handling logic (return some kind of special response etc..)
    _writer.WriteLine("{0}\t{1}\t{2}", request.RequestUri,
    (int) response.StatusCode, response.Headers.Date);
    }

    return response;
    }

    protected override void Dispose(bool disposing)
    {
    if (disposing)
    {
    _writer.Dispose();
    }

    base.Dispose(disposing);
    }
    }

  • 然后,您可以使用 HttpClient创建 HttpClientFactory:
    var httpclient = HttpClientFactory.Create(new ErrorLoggingHandler(new FileStream(@"Location", FileMode.OpenOrCreate)));

    关于asp.net-web-api - 处理来自键入的Web API HttpClient调用的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24120059/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com