繁体   English   中英

如何在ASP.NET Core中将HTTP响应干净地传播到类型化HTTP客户端的使用者

[英]How to propagate HTTP responses cleanly to consumers of a typed HTTP client in ASP.NET Core

在ASP.NET Core中,是否有很好的方法将对象传播到成功的响应或状态代码和响应正文中,以该类型的HTTP客户端的使用者使用?

提供以下API服务:

public class TestApiService
{
    private readonly HttpClient _httpClient;

    public TestApiService(HttpClient httpClient)
    {
        httpClient.BaseAddress = new Uri("https://localhost:5000");
        _httpClient = httpClient;
    }

    public async Task<string> GetVersion()
    {
        var response = await _httpClient.GetAsync("/api/v1/version");

        if (response.IsSuccessStatusCode)
        {
            return await response.Content.ReadAsStringAsync();
        }

        return null;
    }
}

通过以下方式向DI容器注册:

services.AddHttpClient<TestApiService>();

如果响应成功,或者响应TestApiService.GetVersion()我想从TestApiService.GetVersion()方法返回string值,返回状态码和响应主体。

似乎无法执行以下操作:

public async Task<string> GetVersion()
{
    var response = await _httpClient.GetAsync("/api/v1/version");

    response.EnsureSuccessStatusCode();

    return await response.Content.ReadAsStringAsync();
}

并获得所需的结果,因为从HttpResponseMessage.EnsureSuccessStatusCode()引发的HttpRequestException不包含状态代码或响应正文。

在GitHub上有一个开放的问题 ,但是我不确定它是否会很快实现。

虽然确实存在ActionResult ,但似乎确实是针对控制器层的,所以我不确定在这里使用它是否适合该类的使用,或者是否有更好的方法来获得所需的结果?

应该可以创建自己的异常类,然后从服务中抛出该异常类,但是如果要使用某种内置的机制,我真的要避免这种情况。

删除response.EnsureSuccessStatusCode(),这基本上是在检查状态,如果不是200则抛出异常。 考虑使用response.IsSuccessStatusCode或手动检查响应状态代码。 两种方法都可以防止引发您不想要的异常。

if (HttpStatusCode.Ok == response.StatusCode)
{
   // Read your result
}
else if ( // handle the specific failure case was it a 404 or a 401)
{
  string value = await response.Content?.ReadAsStringAsync();
  // Read your failed result
  return $"{response.StatusCode} {value}".Trim()";
}

下一个问题是如何处理服务的失败者并将其传达给服务的被呼叫者? 您是否希望服务对客户端应用程序不透明?

由于您的代码仅返回字符串,因此您是否考虑过返回其他内容,例如包含对象{Success = true | false,Error =“”,ErrorCode = 1234,Data =“ value”}或只是将适当的异常抛出给传达故障的性质。 例如,您可能想抛出一个适当的异常,例如TestApiException,其中TestApiException可能带有ErrorCode或您需要的任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM