【发布时间】:2016-07-11 13:48:54
【问题描述】:
我正在使用 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(在某些时候)看到响应正文中有内容,并确定这意味着一切正常并重置状态代码。
有什么办法可以绕过这个问题,而不必求助于将消息作为标题或其他东西发送? (或者这是正确的方法吗?)
【问题讨论】:
-
写完响应正文的任何部分后,您都无法设置状态码。您是否尝试在编写消息之前调用 HttpUnauthorizedResult.ExecuteResultAsync?
-
看来这个链接可以解决你的问题weblogs.asp.net/gunnarpeipman/…
-
@Gomes 看起来很有前途!我想从概念上讲它是有道理的,应该尽快看看!
-
@Gomes 不幸的是,这并不能解决我的问题,
StatusDescription属性不再是一个东西......
标签: c# asp.net-web-api2 asp.net-core