【发布时间】:2017-02-19 10:08:53
【问题描述】:
我一直在将我的一些 Web 应用程序整合到一个主要的 ASP.NET MVC 项目中;将其中一些分配到单独的区域,以便可以通过子域访问它们。
使用这个(非常有用的)资源(https://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging),我在Web.config 中设置了customErrors 和httpErrors,以便显示自定义错误页面。效果很好。
我将为每个区域/子域使用不同的布局/样式,所以我想知道: 我怎样才能让一个区域显示它自己的一组错误页面?
在当前设置下,所有子域都将显示添加到customErrors 和httpErrors 部分(403.html、404.html 等)的主要自定义错误集;但我更喜欢为某些子域定制错误页面。 (例如,如果其中一个区域完全由单独的域完全处理,则提供常规错误页面是不切实际的。)
更新: 这是场景,带有代码,根据要求。感谢 Ben Foster,他在这里提供了很好的指导:http://benfoster.io/blog/aspnet-mvc-custom-error-pages2。我已经放了 customErrors 的代码,但没有放相应的 httpErrors...为简洁起见,省略了。
<system.web>
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/500.aspx">
<error statusCode="404" redirect="~/404.aspx" />
<error statusCode="500" redirect="~/500.aspx" />
</customErrors>
</system.web>
<location path="MyArea1">
<system.web>
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Areas/MyArea1/500.aspx">
<error statusCode="404" redirect="~/Areas/MyArea1/404.aspx" />
<error statusCode="500" redirect="~/Areas/MyArea1/500.aspx" />
</customErrors>
</system.web>
</location>
<location path="MyArea2">
<system.web>
<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Areas/MyArea2/500.aspx">
<error statusCode="404" redirect="~/Areas/MyArea2/404.aspx" />
<error statusCode="500" redirect="~/Areas/MyArea2/500.aspx" />
</customErrors>
</system.web>
</location>
上面的代码运行良好:
- 如果我导航到“example.com/does/not/exist”,我会得到
~/404.aspx的预期错误页面。 - 如果我导航到“example.com/MyArea1/does/not/exist”,我会
在
~/Areas/MyArea1/404.aspx获取自定义错误页面。
挑战:
现在,我希望使用 HostDomainConstraint(@TetsuyaYamamoto 推荐,在下面的评论中)由一个完全独立的域(例如 exampleOnMyOtherDomain.com)提供一个区域(MyArea2)。可以通过“example.com/MyArea2/validlink”访问的链接现在可以通过以下方式访问:“exampleOnMyOtherDomain.com/validlink”。
现在,如果我尝试“exampleOnMyOtherDomain.com/does/not/exist”,我将获得顶级 404 (~/404.aspx)。这可能是因为“MyArea2”不再在路径中,所以路径为“MyArea2”的位置将不会被拾取。
如何让区域 (MyArea2) 提供自己的错误页面?
【问题讨论】:
-
位置设置可能会有所帮助,请参阅参考:msdn.microsoft.com/en-us/library/ms178692.aspx。它可以在每个位置的
<system.web>元素内包含不同的内容,允许通过指定区域相对路径为不同区域设置customErrors和httpErrors。 -
感谢@TetsuyaYamamoto;这是一个非常有用的评论。我尝试了
location元素,当我的区域是我的主域的子路径(例如example.com/MyArea)时,location元素工作得很好(path="MyArea")!但问题是:当我的区域完全由一个单独的域提供服务时,我不能使用相同的策略(例如myotherexample.net)。 -
访问 myotherexample.net 时显示什么样的错误?可能它应该需要在 Global.asax 路由模块中使用
HostNameContraint进行额外的路由配置(还包括对该区域的 URL 重写)。此外,您可以编辑您的问题以包括区域和路线代码。 -
感谢@TetsuyaYamamoto;编辑了问题。
-
查看您的 web.config 区域设置后,我假设您可以使用
Application_Error处理从 myotherexample.net 到MyArea2的错误,使用Request.Url.Host。此外,您可以将MapRoute设置为处理MyArea2作为重定向区域路径的一部分,然后设置IIS URL 重写模块:iis.net/expand/URLRewrite。
标签: asp.net-mvc web-config custom-errors