Asp.net 5 web api返回状态码和正文

Cli*_*int 6 c# asp.net-web-api2 asp.net-core

我正在使用ASP.NET 5开发一个项目,我正在编写一个web api.

我继承了一些代码和数据库存储过程,使用raiserror来指示错误(用户名/密码不正确,许可证过期等).

除消息文本外,存储过程不返回任何内容以唯一标识该错误.

我希望能够返回HTTP UNAUTHORIZED响应,但也将错误消息传递给客户端.

内置IActionResult HttpUnauthorized()方法不允许给出理由.

所以我编写了自己的ActionResult,如下所示:

public class UnauthorizedWithMessageResult : IActionResult
{
    private readonly string _message;

    public UnauthorizedWithMessageResult(string message)
    {
        _message = message;
    }

    public async Task ExecuteResultAsync(ActionContext context)
    {
        using (var sw = new HttpResponseStreamWriter(context.HttpContext.Response.Body, Encoding.UTF8))
        {
            await sw.WriteLineAsync(_message);
        }

        await new HttpUnauthorizedResult().ExecuteResultAsync(context);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是客户端正在接收200-OK,就像一切都很好.

我已经完成了这个步骤,在完成委托之后HttpUnauthorizedResult,状态代码确实设置为403.

看起来Web API(在某些时候)看到响应正文中有内​​容,并确定这意味着一切正常并重置状态代码.

有没有办法解决这个问题,而不必诉诸于作为标题或其他东西发送消息?(或者这是正确的方法吗?)

Luc*_*rsi 5

它以这种方式工作:

public IActionResult IWillNotBeCalled()
{
    return new UnauthorizedWithMessageResult("MY SQL ERROR");            
}

public class UnauthorizedWithMessageResult : IActionResult
{
    private readonly string _message;

    public UnauthorizedWithMessageResult(string message)
    {
        _message = message;
    }

    public async Task ExecuteResultAsync(ActionContext context)
    {
        // you need to do this before setting the body content
        context.HttpContext.Response.StatusCode = 403;

        var myByteArray = Encoding.UTF8.GetBytes(_message);
        await context.HttpContext.Response.Body.WriteAsync(myByteArray, 0, myByteArray.Length);
        await context.HttpContext.Response.Body.FlushAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)

您必须设置StatusCode之前设置正文,并且必须刷新正文流以确保将在响应中设置内容.

在此输入图像描述

希望能帮助到你 :)


CSJ*_*CSJ 5

你可以这样做:

return new ObjectResult("The message") { 
    StatusCode = (int?) HttpStatusCode.Unauthorized 
};
Run Code Online (Sandbox Code Playgroud)