Server.Transfer from Global.asax 在部署到 Azure 时不起作用
本文关键字:Azure 不起作用 部署 Transfer from Global asax Server | 更新日期: 2023-09-27 18:35:46
我在global.asax中有以下代码,当出现404异常时,它会传输到静态的NotFound.aspx文件。 这适用于我的开发机器,具有调试或发布版本。 将发布版本部署到 azure 应用服务时,我不会获取静态 NotFound.aspx 文件,而是获取一个仅包含文本的页面:The resource you are looking for has been removed, had its name changed, or is temporarily unavailable.
我已经验证了静态文件是否存在于 Azure 部署中。
global.asax 中的代码是:
protected void Application_Error(object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
Response.Clear();
HttpException httpException = exception as HttpException;
if (httpException != null)
{
ErrorLogger.Log(httpException);
Server.ClearError();
switch (httpException.GetHttpCode())
{
case 404:
// page not found
Response.StatusCode = 404;
Server.Transfer("~/NotFound.aspx");
break;
default:
Response.StatusCode = 500;
Server.Transfer("~/Error.aspx");
break;
}
}
}
问题似乎是 Azure 服务器环境定义了它的 httpErrors 配置部分,该部分可以在这些错误到达Application_Error之前拦截这些错误。 您可以修改它以使错误通过,或者首先使用它来处理错误(这似乎是最佳选择)。 使用responseMode="File"
您可以避免发出重定向,只需直接提供自定义错误页面和正确的状态代码。这似乎是一种更有效和正确的方法。例:
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace" >
<remove statusCode="404"/>
<error statusCode="404" path="NotFound.html" responseMode="File"/>
<remove statusCode="500"/>
<error statusCode="500" path="Error.html" responseMode="File"/>
<remove statusCode="400"/>
<error statusCode="400" path="Error.html" responseMode="File"/>
</httpErrors>
</system.webServer>
欲了解更多信息:
https://www.iis.net/configreference/system.webserver/httperrors
您也可以尝试在Web.config
中指定重定向规则:
<configuration>
<system.webServer>
<httpErrors errorMode="DetailedLocalOnly" existingResponse="PassThrough">
<remove statusCode="404"/>
<add statusCode="404" path="/NotFound.aspx" responseMode="Redirect" />
</httpErrors>
</system.webServer>
</configuration>
然后在Web.Release.config
(或在 Azure 中使用的其他配置)中:
<configuration>
<system.webServer>
<httpErrors errorMode="DetailedLocalOnly" existingResponse="Replace" xdt:Transform="SetAttributes">
</httpErrors>
</system.webServer>
</configuration>
您可以以类似的方式添加代码 500 错误页面。
将 responseMode 设置为 重定向 使 IIS 使用 302 重定向用户,将其设置为 ExecuteURL 会将响应替换为错误页面,但将 URL 保留在地址栏中。
这是一篇关于以这种方式处理错误的好文章:http://tedgustaf.com/blog/2011/5/custom-404-and-error-pages-for-asp-net-and-static-files/