当前位置: 首页 > 知识库问答 >
问题:

MVC 6 HttpResponseException

卫鸿朗
2023-03-14
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized) { ReasonPhrase = "invalid username/password" });

共有1个答案

苍和裕
2023-03-14

我认为这种变化是由于。NET核心--ASP.NET试图做所有开箱即用的事情,而ASP.NET核心只做您明确告诉它的事情(这是为什么它如此快速和可移植性的一个重要原因)。

如果你想要这个行为的核心,你需要添加它,要么作为某人为你写的包,要么通过滚动你自己的包。

相当简单。首先,您需要一个自定义异常来检查:

public class StatusCodeException : Exception
{
    public StatusCodeException(HttpStatusCode statusCode)
    {
        StatusCode = statusCode;
    }

    public HttpStatusCode StatusCode { get; set; }
}
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;
}

这是相当简单的,有人可能已经写了一个更完整的,但我还没有找到一个或得到一个明确的答案,为什么这是放弃。

 类似资料:

相关问答

相关文章

相关阅读