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

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

我inheritance了一些代码和数据库存储过程,使用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); } } 

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

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

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

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

它的工作方式如下:

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

您可以返回所需的任何状态代码,如下所示:

 return new HttpStatusCodeResult(403);