c# - MVC 6 没有为未定义的路由抛出异常

标签 c# .net asp.net-mvc

我有一个非常基本的带有基本路由的 asp.net MVC 6 应用程序,我有一个自定义 ErrorController 来将错误路由到某些 View 。

不过,我希望当用户键入一个不存在的 URL 时,会抛出一个异常(我可以处理)。但是,当我输入一些随机 URL 时没有异常抛出,我只是得到一个空白页面。我很确定这在 MVC < 6 中同样有效。

如果我只是在 Controller 中抛出异常,错误处理本身就可以正常工作。

Startup.cs(部分)

public void Configure(IApplicationEnvironment appEnv, IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseBrowserLink();
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler(HandleException);
    }
    app.UseStaticFiles();
    app.UseMvc(routes => MapRoutes(routes, appEnv));
}


private static void MapRoutes(IRouteBuilder routes, IApplicationEnvironment env)
{
    routes.MapRoute(
       name: "default",
       template: "{controller}/{action}/{id?}",
       defaults: new { controller = "main", action = "index" });          
}

private static void HandleException(IApplicationBuilder errorApp)
{
    #pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously
    errorApp.Run(async context => HandleErrorContext(context));
    #pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously
}

private static void HandleErrorContext(HttpContext context)
{
    var error = context.Features.Get<IExceptionHandlerFeature>();
    var exception = error.Error;
    if (exception == null)
    {
        context.Response.Redirect("../error/external");
    }
    else if (exception is ExpirationException)
    {
        context.Response.Redirect("../error/expired");
    }
    else if (exception is HttpException)
    {
        var httpException = exception as HttpException;
        int code = httpException.GetHttpCode();
        context.Response.Redirect("../error/external?code=" + code);
    }
    else
    {
        context.Response.Redirect("../error/external");
    }
}

最佳答案

不是我问题的直接答案,但我从 https://stackoverflow.com/a/4833519/2713516 得到了解决方法在职的。我仍然想知道为什么 asp.net 没有抛出 404。

           routes.MapRoute(
                "PageNotFound",
                "{*catchall}",
                new { controller = "Home", action = "PageNotFound" }
                );

关于c# - MVC 6 没有为未定义的路由抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36590673/

相关文章:

c# - 如何传递这个参数?

c# - 在服务器应用程序中将中间证书与 SslStream 和 X509Certificate2 一起使用

c# - 如何读取一些 XML 然后在 .NET 中拆分出各种节点/元素?

c# - 拆分逗号以将多行插入数据库 (ASP.NET MVC)

C# 奇怪的方法调用使用指针?

C# else if 混淆

.net - 它是 C# 的新样式进度条吗?

.net - 在 VS2017 中使用自定义程序集预览 SSRS 报告时出错

asp.net-mvc - 如何用 Html.BeginForm() 传入 ID?

c# - EF 通用存储库多重包含和按调用排序