发生异常时,Web Api始终返回http状态代码200

Eli*_*eth 6 c# asp.net-web-api asp.net-web-api2

public class GlobalExceptionHandler : ExceptionHandler
{
    public override void Handle(ExceptionHandlerContext context)
    {

        context.Result = new NiceInternalServerExceptionResponse("The current operation could not be completed sucessfully.);
    }
}
Run Code Online (Sandbox Code Playgroud)

调用此Get操作时:

        [HttpGet]
        public async Task<IHttpActionResult> Get()
        {
            Convert.ToInt16("this causes an exception state");
            var data = await service.Get();
            return Ok(data);
        }
Run Code Online (Sandbox Code Playgroud)

引发异常...并且触发了我的全局exc处理程序。

当我的自定义响应返回给客户端时,我的提琴手总是说:

结果:200

我也可以将更return Ok(data);改为return NotFound();

这不会改变结果状态代码中的任何内容。

如何覆盖/拦截http状态创建并返回自己的状态代码500?

在我的Web客户端上,仅当返回状态码500时,我需要显示一个带有登录ID +错误消息的漂亮错误对话框。

Ale*_*ker 1

您需要在以下位置设置状态代码IHttpActionResult

public class NiceInternalServerExceptionResponse : IHttpActionResult
{
    public string Message { get; private set; }        
    public HttpStatusCode StatusCode { get; private set; }

    public NiceInternalServerExceptionResponse(
        string message, 
        HttpStatusCode code)
    {
        Message = message;
        StatusCode = code; 
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = new HttpResponseMessage(StatusCode);
        response.Content = new StringContent(Message);
        return Task.FromResult(response);
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的GlobalExceptionHandler通行证HttpStatusCode.InternalServerError(500)中:

public override void Handle(ExceptionHandlerContext context)
{
    context.Result = new NiceInternalServerExceptionResponse(
        "The current operation could not be completed sucessfully.",
        HttpStatusCode.InternalServerError);
}
Run Code Online (Sandbox Code Playgroud)