如何在运行时覆盖web.config customErrors设置?

时间:2011-06-20 06:03:42

标签: asp.net web-config runtime custom-errors

我的Azure C#应用程序的 web.config 文件中有以下代码:

<!-- Turn on Custom Errors -->
<!-- Switch the mode to RemoteOnly for Retail/Production -->
<!-- Switch the mode to On for to see error pages in the IDE during development -->
<customErrors mode="On" defaultRedirect="ErrorPage.aspx">
   <error statusCode="403" redirect="ErrorPage403.aspx"/>
   <error statusCode="404" redirect="ErrorPage404.aspx"/>
</customErrors>

当我本地访问我的网站时{(3}}),这适用于错误,但我也有一个应用程序的Facebook版本,其中所有页面使用不同的MasterPage,因此使用不同的URL (http://ipredikt.com/ErrorPage.aspx)。

当我在Facebook应用模式下运行时,是否有可能在运行时修改customError重定向值,就像我在web.config中有以下设置一样:

<customErrors mode="On" defaultRedirect="ErrorPageFB.aspx">
   <error statusCode="403" redirect="ErrorPage403FB.apx"/>
   <error statusCode="404" redirect="ErrorPage404FB.apx"/>
</customErrors>

我不认为我可以在应用程序范围内设置它,因为我的应用程序中的个人页面知道它们是否在Facebook模式下运行。

4 个答案:

答案 0 :(得分:1)

“Facebook模式”似乎可以在Session中跟踪,可以在ErrorPage.aspx中访问,以触发向ErrorPageFB.aspx的传输。

更新 - 您可以使用Request.QueryString清理您的暴力解决方案:

protected override void OnInit(System.EventArgs e)
{         
    // If the user tries, for example, to navigate to" /fb/foo/bar
    // then the Request.Url.Query will be as follows after the 404 error: ?aspxerrorpath=/fb/foo/bar
    var requestedPath = Request.RequestContext.HttpContext.Request.QueryString["aspxerrorPath"];

    if (requestedPath.StartsWith("/fb/", StringComparison.OrdinalIgnoreCase))
    {
        var requestedUrl = Request.RequestContext.HttpContext.Request.Url;
        var pathAndQuery = requestedUrl.PathAndQuery;
        var absolutePath = requestedUrl.AbsolutePath;

        var mungedVirtualPath = pathAndQuery.Replace(absolutePath, "/ErrorPage404FB.aspx");

        Response.Redirect(mungedVirtualPath);
    }

    base.OnInit(e);
}

Request.RequestContext.HttpContext.Request实际上是否会返回与简单Request不同的实例?

答案 1 :(得分:1)

您好我认为您可以做的是根据引荐来源在自定义错误页面内进行另一次重定向 - Request.UrlReferrer,有时引用者为空,所以请确保您处理

答案 2 :(得分:1)

所以这是一个强力解决方案。我在页面上使用这个非Facebook模式404错误:

  protected override void OnInit(System.EventArgs e)
  {         
     // If the user tries, for example, to navigate to" /fb/foo/bar
     // then the Request.Url.Query will be as follows after the 404 error: ?aspxerrorpath=/fb/foo/bar
     string queryString = Request.RequestContext.HttpContext.Request.Url.Query;

     string[] str = queryString.Split('=');

     if (str.Length > 0)
     {
        string[] str2 = str[1].Split('/');

        if (str2.Length > 1)
        {
           string test = str2[1].ToLowerInvariant();

           if (test == "fb")
           {
              string pathAndQuery = Request.RequestContext.HttpContext.Request.Url.PathAndQuery;
              string absolutePath = Request.RequestContext.HttpContext.Request.Url.AbsolutePath;

              string mungedVirtualPath = pathAndQuery.Replace(absolutePath, "/ErrorPage404FB.aspx");

              Response.Redirect(mungedVirtualPath);
           }
        }
     }

     base.OnInit(e);
  }

很难理想,但它确实有效。

答案 3 :(得分:0)

执行此操作的简单方法是使用会话,但如果您不在网站上使用会话,则可以始终使用cookie,当用户到达错误页面时,检查cookie并确定是否要将其重定向到新的错误页面