4

标题说明了一切。实际上有大量关于如何做到这一点的信息,我非常接近。我在 google 上阅读了几篇文章以及以下 stackoverflow 帖子:

如何正确处理 ASP.NET MVC 中的 404?

如何正确处理 ASP.NET MVC 中的 404?

asp.net MVC3 上的自定义错误页面

http://blog.davebouwman.com/2011/04/21/custom-404-pages-for-asp-net-mvc-3/

我有 404 在行动层面工作。我在我的控制器上使用 *.aspx 后缀。如果你有一个像

"http://blahblah/AppName/idontexist.aspx"

自定义错误控制器已加载。我的问题归结为没有 .aspx 且也不存在的控制器。这会产生我不想要的典型 IIS Server 404 html 页面。工作中的另一个问题是我无法真正更改 IIS 配置本身。我必须通过 code/web.config/global.asax(或我没有想到的项目的其他部分)来处理这个问题。

这是我的 web.config 条目(这是根 web.config,不是视图):

<httpErrors defaultPath="/Error.aspx/HttpError" errorMode="Custom" existingResponse="Replace" defaultResponseMode="ExecuteURL">
  <remove statusCode="500" subStatusCode="-1" />
  <remove statusCode="404" subStatusCode="-1" />
  <error statusCode="500" path="/Error.aspx/HttpError" responseMode="ExecuteURL" />
  <error statusCode="404" path="/Error.aspx/NotFound" responseMode="ExecuteURL" />
</httpErrors>

<customErrors mode="On"  defaultRedirect="~/Error.aspx/HttpError">
  <error redirect="~/Error.aspx/NotFound" statusCode="404" />
</customErrors>  

这是我在 global.asax 中的路线:

       routes.MapRoute(
            "Default", // Route name
            "{controller}.aspx/{action}/{id}", // URL with parameters
            new { controller = "StartController", action = "StartAction", id = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "NotFoundController", // Route name
            "{controller}.aspx", // URL with parameters
            new { controller = "Error", action = "NotFound" } // Parameter defaults
        );

        routes.MapRoute(
            "NotFoundController2", // Route name
            "{controller}", // URL with parameters
            new { controller = "Error", action = "NotFound" } // Parameter defaults
        );

        routes.MapRoute(
            "Root", // Route name
            "", // URL with parameters
            new { controller = "StartController", action = "StartAction", id = UrlParameter.Optional } // Parameter defaults
        );

我还认为使用路由来捕获这些问题的一个障碍是我丢失了 404 状态码;但是,由于路线指向专门为此目的设计的动作,我认为这一点没有实际意义。

无论如何,任何想法、建议或批评都将受到欢迎。我在这里很近。谢谢!

编辑 1

我一直在研究这个。如果在 url 中找不到文本“.aspx”,是否可以定义自定义路由约束,该约束将重定向到错误控制器?

编辑 2

看起来不像是打算使用约束的方式。我也尝试实施

    protected void Application_Error()
    {
    }

根据http://blog.davebouwman.com/2011/04/21/custom-404-pages-for-asp-net-mvc-3/的实现方法,但是当我没有为控制器指定 .aspx 时,看起来应用程序永远没有机会抛出错误。看起来这在我的应用程序甚至可以响应它之前由 IIS 处理。

如果我可以进行 IIS 更改,最好只更改此应用程序的虚拟目录条目,是否可以提供更可行的解决方案?

如果只是在某个地方我可以获取 url,搜索 .aspx,如果找不到,则抛出 404 未找到,但重定向到应用程序级别的 404 页面而不是 IIS 默认值,那将非常接近理想。

想法?

编辑 3

我认为处理这种情况是不可能的,除非您的应用程序是 IIS 服务器的根站点而不是虚拟目录。我注意到,在 IIS 6.0 中,您可以调整默认的 IIS 错误页面。不仅如此,您还可以用 URL 替换某些情况。我尝试使用虚拟目录站点执行此操作,但会显示默认的 IIS 404 Not found 页面。

所以它相当于:如果你对你的设置有一个愚蠢的控制,你可以在 IIS 6 上处理这个问题,并且你正在做的站点是根站点。

在我想象的现实世界场景中不太适用。

4

1 回答 1

1

如果不能对 IIS 进行更改,我认为这是不可能的。使用 IIS 6,请求不会进入 ASP.Net 领域,除非它们被映射到 ASP.Net ISAPI 处理程序 (aspnet_isapi.dll)。对于普通的 ASP.Net 扩展,当安装 .Net(.ashx、.aspx 等)时,映射已经在 IIS6 中设置。这就是为什么不存在的控制器的 404 会获得正常的 IIS 404 页面。IIS 正在寻找磁盘上不存在的文件夹。

为了让您的 404 页面处理程序按预期工作(假设您可以对 IIS 进行更改),您需要设置所谓的通配符映射。这会将所有请求发送到 ASP.Net ISAPI。还需要指示 IIS 绕过对物理文件的检查,因为在这种情况下不存在任何文件。该选项有一个复选框。我面前不再有 IIS 6,但此站点上的选项 1 将引导您完成它:

http://blog.stevensanderson.com/2008/07/04/options-for-deploying-aspnet-mvc-to-iis-6/

我以前做过这个,它确实有效。将所有内容发送到 .Net ISAPI 需要权衡取舍。所有静态文件都将由 ASP.Net(甚至图像)而不是 IIS 直接处理,因此请注意其中的含义。

希望这可以帮助

于 2013-03-26T16:04:34.940 回答