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
};
我正在使用 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
};