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;                    
            }
        }
    }

Server.Transfer from Global.asax 在部署到 Azure 时不起作用

问题似乎是 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/