我正在尝试以下列方式返回状态代码
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "invalid username/password" });
现在MVC6不支持这个,因为使用IActionResult对我来说真的很傻,而且不那么直观。 我找到了以下帖子one和two。 第一个导致链接断开,第二个适用于MVC应用程序。
我确实意识到我需要创建一个中间件来解决这个问题,但我不知道从哪里开始,因为这是非常有用的东西,我希望有一些我可以使用的开源解决方案或者也许一段代码片段。
为了记录,我正在使用ASP.net 5 rc1 update 1 MVC 6
答案 0 :(得分:5)
我认为这种变化是由于.NET Core - ASP.NET试图完成所有开箱即用的工作,ASP.NET Core只会执行你明确告诉它的事情(这是它为什么这么多的重要部分)更快捷,便携)。
如果您想在Core中使用此行为,则需要将其添加为某人为您编写的包或自行编辑。
这很简单。首先,您需要一个自定义异常来检查:
public class StatusCodeException : Exception
{
public StatusCodeException(HttpStatusCode statusCode)
{
StatusCode = statusCode;
}
public HttpStatusCode StatusCode { get; set; }
}
然后你需要一个RequestDelegate
处理程序来检查新的异常并将其转换为HTTP响应状态代码:
public class StatusCodeExceptionHandler
{
private readonly RequestDelegate request;
public StatusCodeExceptionHandler(RequestDelegate next)
{
this.request = next;
}
public Task Invoke(HttpContext context) => this.InvokeAsync(context); // Stops VS from nagging about async method without ...Async suffix.
async Task InvokeAsync(HttpContext context)
{
try
{
await this.request(context);
}
catch (StatusCodeException exception)
{
context.Response.StatusCode = (int)exception.StatusCode;
context.Response.Headers.Clear();
}
}
}
然后在您的启动中注册此中间件:
public class Startup
{
...
public void Configure(IApplicationBuilder app)
{
...
app.UseMiddleware<StatusCodeExceptionHandler>();
最后,您可以在操作中抛出HTTP状态代码异常,同时仍然返回一个可以轻松进行单元测试的显式类型:
public Thing Get(int id) {
Thing thing = GetThingFromDB();
if (thing == null)
throw new StatusCodeException(HttpStatusCode.NotFound);
return thing;
}
这很简单,有人可能写了一个更完整的,但我找不到一个或得到明确的答案,为什么这被删除。