[英]Asp.net 5 web api return status code and body
我正在使用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);
}
}
问题是客户端正在接收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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.