在ASP.NET MVC 5您可以抛出一个带有HTTP代码的HttpException,这将设置如下响应:

throw new HttpException((int)HttpStatusCode.BadRequest, "Bad Request.");

ASP.NET Core中不存在HttpException.等价的代码是什么?

推荐答案

我实现了自己的HttpException和支持中间件,它捕获所有HttpException并将它们转换为相应的错误响应.下面是简短的摘录.你也可以使用Boxed.AspNetCore Nuget软件包.

Usage Example in Startup.cs

public void Configure(IApplicationBuilder application)
{
    application.UseIISPlatformHandler();

    application.UseStatusCodePagesWithReExecute("/error/{0}");
    application.UseHttpException();

    application.UseMvc();
}

Extension Method

public static class ApplicationBuilderExtensions
{
    public static IApplicationBuilder UseHttpException(this IApplicationBuilder application)
    {
        return application.UseMiddleware<HttpExceptionMiddleware>();
    }
}

Middleware

internal class HttpExceptionMiddleware
{
    private readonly RequestDelegate next;

    public HttpExceptionMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await this.next.Invoke(context);
        }
        catch (HttpException httpException)
        {
            context.Response.StatusCode = httpException.StatusCode;
            var responseFeature = context.Features.Get<IHttpResponseFeature>();
            responseFeature.ReasonPhrase = httpException.Message;
        }
    }
}

HttpException

public class HttpException : Exception
{
    private readonly int httpStatusCode;

    public HttpException(int httpStatusCode)
    {
        this.httpStatusCode = httpStatusCode;
    }

    public HttpException(HttpStatusCode httpStatusCode)
    {
        this.httpStatusCode = (int)httpStatusCode;
    }

    public HttpException(int httpStatusCode, string message) : base(message)
    {
        this.httpStatusCode = httpStatusCode;
    }

    public HttpException(HttpStatusCode httpStatusCode, string message) : base(message)
    {
        this.httpStatusCode = (int)httpStatusCode;
    }

    public HttpException(int httpStatusCode, string message, Exception inner) : base(message, inner)
    {
        this.httpStatusCode = httpStatusCode;
    }

    public HttpException(HttpStatusCode httpStatusCode, string message, Exception inner) : base(message, inner)
    {
        this.httpStatusCode = (int)httpStatusCode;
    }

    public int StatusCode { get { return this.httpStatusCode; } }
}

从长远来看,我建议不要使用异常返回错误.异常比仅仅从方法返回错误要慢.

.net相关问答推荐

使用 SSH.NET 查找具有特定文件名的最新 SFTP 文件

图像 UriSource 和数据绑定

process.WaitForExit() 异步

如何获取 Sql Server 数据库中所有模式的列表

在 WinForms 应用程序中查找焦点控件的首选方法是什么?

使用 C# 清除文本文件的内容

.Net 中的 Int128?

C# 中 try/finally 的开销?

图像与位图类

读取方法的属性值

如何对无法加载的 VSTO 插件进行故障排除?

关闭 Visual Studio 中所有选项卡但当前选项卡的键盘快捷键?

如何禁用 Alt + F4 关闭表单?

形成两个列表并集的最简单方法

了解 C# 中的协变和逆变接口

.NET 委托类型的正确命名约定?

如何卸载Microsoft .NET Core 1.0.0 RC2 - VS 2015 Tooling Preview 1?

检测到包降级警告(dotnet core,vs 2017)

您可以将 Microsoft Entity Framework 与 Oracle 一起使用吗?

不签署 .NET 程序集有什么问题吗?