【问题标题】:.NET Core WebApi Get HttpClient Error Message.NET Core WebApi 获取 HttpClient 错误消息
【发布时间】:2019-12-25 20:26:48
【问题描述】:

我正在尝试显示使用 HttpClient.PostJsonAsync<T>() 时从 Web API 返回的相关错误消息。

在我的 Web API 中,例如在登录失败时,我将返回 401 未授权异常,正文中带有错误处理中间件的消息;

public class HttpErrorHandlerMiddleware
{
    private readonly RequestDelegate _next;

    public HttpErrorHandlerMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (HttpStatusCodeException exception)
        {
            if (!context.Response.HasStarted)
            {
                context.Response.StatusCode = (int)exception.StatusCode;
                context.Response.Headers.Clear();
                await context.Response.WriteAsync(exception.Message);
            }
        }
    }
}

// Extension method used to add the middleware to the HTTP request pipeline.
public static class HttpErrorHandlerMiddlewareExtensions
{
    public static IApplicationBuilder UseHttpErrorHandlerMiddleware(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<HttpErrorHandlerMiddleware>();
    }
}

然后在Postman 中显示消息,例如“用户名或密码无效”、“用户被锁定”等

但是,当我尝试在客户端捕获错误时,例如

try
{
    var result = await _httpClient.PostJsonAsync<LoginResponse>("api/login", loginModel);

    /* Removed for brevity */
}
catch(Exception ex)
{
     return new LoginResponse { Success = false, Error = ex.Message };
}

返回的错误始终是“响应状态码不表示成功:401(未授权)。”

请问我如何从PostJsonAsync&lt;T&gt; 的返回中获取错误的详细信息?

【问题讨论】:

  • 因为它不认为您的消息是异常原因。您始终可以使用 401 返回一条消息“一切都已完美完成”。要获取该消息,请阅读从客户端返回的正文
  • @TuyenPham 请问我如何从PostJsonAsync&lt;T&gt; 的返回异常中读取正文?
  • 代替PostJsonAsync,可以使用PostAsync,当出现异常时可以读取内容:stackoverflow.com/a/39414248/1560697
  • 你是如何在正文中返回401Invalid UserName or Password 的? PostJsonAsync 是什么?

标签: c# asp.net-core-webapi asp.net-core-2.1


【解决方案1】:

401 是一个验证响应,它不会被HttpErrorHandlerMiddleware 捕获。

我不确定您如何实现 401 和 PostJsonAsync。这是一个工作演示:

  1. 控制器动作

    [HttpPost]
    public IActionResult Login(LoginModel loginModel)
    {
        return StatusCode(401, new LoginResponse {
            Success = false,
            Error = "Invalid User Name and Password"
        });
    }
    
  2. HttpClient 请求

    public async Task<LoginResponse> Test(LoginModel loginModel)
    {
        var _httpClient = new HttpClient();
        var result = await _httpClient.PostAsJsonAsync<LoginModel>("https://localhost:44322/api/values/login", loginModel);
        return await result.Content.ReadAsAsync<LoginResponse>();
    }
    

【讨论】:

    猜你喜欢
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2016-12-13
    • 2020-09-07
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多