gpt4 book ai didi

asp.net-mvc - ASP.NET MVC 区域可以显示自己的一组错误页面吗?

转载 作者:行者123 更新时间:2023-12-02 09:47:18 25 4
gpt4 key购买 nike

我一直在将一些 Web 应用程序整合到一个主要的 ASP.NET MVC 项目中;将其中一些分配到单独的区域,以便可以通过子域访问它们。

使用这个(非常有用的)资源( https://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging ),我在 Web.config 中设置了 customErrorshttpErrors ,以便显示自定义错误页面。效果很好。

我将在每个区域/子域使用不同的布局/样式,所以我想知道:如何让一个区域显示自己的一组错误页面?

使用当前设置,所有子域都将显示添加到 customErrorshttpErrors 部分的主要自定义错误集(403.html、404.html ,等等);但我更喜欢为某些子域定制错误页面。 (例如,如果其中一个区域完全由单独的域专门处理,则提供常规错误页面是不切实际的。)

更新:这是场景,并根据要求提供了代码。感谢 Ben Foster,他在这里提供了很好的指导:http://benfoster.io/blog/aspnet-mvc-custom-error-pages 2 。我已经放置了 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 获取自定义错误页面。

挑战:

现在我希望一个区域 (MyArea2) 由完全独立的域(例如 exampleOnMyOtherDomain.com)提供服务,使用 HostDomainConstraint (正如 @TetsuyaYamamoto 所建议的,在下面的评论中)。本来可以通过“example.com/MyArea2/validlink”访问的链接现在可以通过以下方式访问:“exampleOnMyOtherDomain.com/validlink”。

现在,如果我尝试“exampleOnMyOtherDomain.com/does/not/exist”,我将收到顶级 404 (~/404.aspx)。这可能是因为“MyArea2”不再位于路径中,因此不会选取路径为“MyArea2”的位置。

如何让区域 (MyArea2) 提供其自己的错误页面?

最佳答案

根据一些研究以及 @TetsuyaYamamoto 的有用指示,我采用了以下策略。

我正在使用以下代码处理 Global.asax 中的“Application_Error”事件:

protected void Application_Error(object sender, EventArgs e)
{
string hostName = Request.Headers["host"].Split(':')[0];
if (hostName.Contains("exampleOnMyOtherDomain"))
{
Exception exception = Server.GetLastError();
Response.Clear();
HttpException httpException = exception as HttpException;
Response.TrySkipIisCustomErrors = true;

switch (httpException.GetHttpCode())
{
case 404:
Response.StatusCode = 404;
Server.Transfer("~/Errors/MyArea2_404.htm");
break;
case 500:
default:
Response.StatusCode = 500;
Server.Transfer("~/Errors/MyArea2_500.htm");
break;
}
Server.ClearError();
}
}

注意事项:

  • hostName.Contains("exampleOnMyOtherDomain") 应该将主机名与我感兴趣处理的区域进行比较。我将为其他区域添加 else...if 语句;
  • Response.TrySkipIisCustomErrors = true 应阻止 IIS 尝试处理错误;
  • Response.StatusCode 适当设置状态代码('404'、'500'...);
  • Server.Transfer() 读取我想要显示为错误页面的文件;
  • Server.ClearError() 应表示错误已被处理。

我希望 customErrors/httpErrors 继续处理常规错误。当执行通过 Application_Error block 而未得到处理时(即未调用 Server.ClearError()),customErrors/httpErrors 将处理错误。

对于处理由不同域提供服务的区域的错误,这似乎是一个不错的策略。

关于asp.net-mvc - ASP.NET MVC 区域可以显示自己的一组错误页面吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39967554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com