Asp.net 5 web api return 状态码和 body

Asp.net 5 web api return status code and body

我正在使用 ASP.NET 5 开发一个项目,并且正在编写 Web api。

我继承了一些使用 raiserror 指示错误的代码和数据库存储过程(username/password 不正确,许可证过期等)。

除了消息文本,存储过程return没有任何东西可以唯一标识该错误。

我希望能够 return 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);
    }
}

问题是客户端正在收到 200-OK,好像一切正​​常。

我已经完成了这个,在完成对 HttpUnauthorizedResult 的委托后,状态代码确实设置为 403。

Web API 似乎(在某个时候)看到响应的 body 中有内容,并认为这意味着一切正常并重置状态代码。

有什么办法可以解决这个问题而不必诉诸 header 或其他方式发送消息? (或者这是正确的方法吗?)

您可以return任何您想要的状态代码,例如:

return new HttpStatusCodeResult(403);

它是这样工作的:

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();
    }
}

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

希望对您有所帮助:)

你可以这样做:

return new ObjectResult("The message") { 
    StatusCode = (int?) HttpStatusCode.Unauthorized 
};