Как переопределить настройки web.config customErrors во время выполнения?

У меня есть следующий код в файле web.config для моего приложения ASP.NET C #, размещенного в Azure:

<!-- 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>

Это отлично подходит для ошибок, когда я открываю свой сайт изначально (http://ipredikt.com/ErrorPage.aspx), но у меня также есть версия приложения для Facebook, в которой все страницы используют другой MasterPage и, следовательно, другой URL-адрес (http://ipredikt.com/ErrorPageFB.aspx).

Можно ли изменить значения перенаправления customError во время выполнения, когда я работаю в режиме приложения Facebook, как если бы у меня были следующие настройки в web.config:

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

Я не думаю, что могу установить это в области приложения, поскольку это отдельные страницы в моем приложении, которые знают, работают ли они в режиме Facebook.


person Armchair Bronco    schedule 20.06.2011    source источник


Ответы (4)


Привет, я думаю, что вы можете сделать еще одно перенаправление внутри своей пользовательской страницы ошибки в соответствии с реферером - Request.UrlReferrer, когда реферер имеет значение null, поэтому убедитесь, что вы справились с этим

person kleinohad    schedule 20.06.2011
comment
См. Комментарий ниже о том, что UrlReferrer имеет значение null. - person Armchair Bronco; 20.06.2011

Итак, вот решение с использованием грубой силы. Я использую это на странице для ошибок 404, не связанных с Facebook:

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

Вряд ли идеально, но работает.

person Armchair Bronco    schedule 20.06.2011
comment
Измените Server.Transfer () на Response.Redirect (), поскольку мы хотим, чтобы измененный URL-адрес был видимым. Server.Transfer учитывает новый URL-адрес, но отображает исходный. - person Armchair Bronco; 20.06.2011

«Режим Facebook» кажется чем-то, что вы могли бы отслеживать в сеансе, который будет доступен в 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?

person dahlbyk    schedule 20.06.2011
comment
Итак, вы говорите, что я должен просто разрешить перенаправление из web.config, а затем выполнить другое перенаправление или server.transfer () из ErrorPage.aspx, если я нахожусь в режиме Facebook? - person Armchair Bronco; 20.06.2011
comment
На самом деле мы вообще не используем сеанс в нашем приложении. Он выключен, так что это не вариант для нас. - person Armchair Bronco; 20.06.2011
comment
Привет, посмотрите на мое предложение ниже, вы можете проверить URL-реферер, а затем решить, хотите ли вы выполнить перенаправление на новую страницу с ошибкой - person kleinohad; 20.06.2011
comment
Так как же отследить, какая главная страница должна отображаться в нескольких запросах? - person dahlbyk; 20.06.2011
comment
Запросы от приложения Facebook всегда будут иметь форму: apps.facebook.com/ipredikt/fb ... У меня будет маршрутизация ASP.NET, которая сопоставит этот запрос с: defaultfb.aspx. Эта страница, в свою очередь, знает, что это страница Facebook, поэтому она устанавливает соответствующие переменные IsFacebookPage для всех элементов управления ASCX, составляющих пользовательский интерфейс. Как я уже отмечал, сами страницы знают, являются ли они страницами в режиме Facebook, поэтому я не могу установить это в области приложения. - person Armchair Bronco; 20.06.2011
comment
Возможно, Page_Error() - это вариант, как описано здесь: msdn.microsoft.com/ en-us / library / - person dahlbyk; 20.06.2011
comment
Я думал об ошибке страницы, но проблема в том, что какая-то ошибка не возникает на странице. Например, я могу принудительно выдать ошибку 404, перейдя на несуществующую страницу, например ipredikt.com/fb / foo / bar / zappa. Итак, в этом примере нет страницы. - person Armchair Bronco; 20.06.2011
comment
Может ли ваша страница 404 проверить запрошенный URL и соответствующим образом скорректировать, если увидит /fb/? - person dahlbyk; 20.06.2011
comment
Ага, это то, чем я закончил. Смотрите мое решение ниже. Теперь у меня есть статический служебный метод, поскольку это исправление используется на нескольких разных страницах (общая ошибка, 404 и 403). - person Armchair Bronco; 20.06.2011
comment
Код в примере грубой силы содержит код, который мне нужен для маршрутизации ASP.NET, поэтому для этого мне пришлось использовать: Request.RequestContext.HttpContext.Request. Я все еще пытаюсь решить, использовать ли маршрутизацию для ErrorPages или сохранить QueryString, сгенерированную ASP.NET, в неизменном виде. - person Armchair Bronco; 20.06.2011

Самый простой способ сделать это - использовать сеанс, но если вы не используете сеанс на своем веб-сайте, вы всегда можете использовать файл cookie, и когда пользователь переходит на страницу с ошибкой, изучите файл cookie и решите, хотите ли вы перенаправить его на новую страницу с ошибкой.

person kleinohad    schedule 20.06.2011
comment
Чувак, это действительно похоже на большой объем работы, чтобы отобразить версию страницы с ошибкой для Facebook. - person Armchair Bronco; 20.06.2011
comment
UrlReferrer недоступен. Это ноль. Я предполагаю, что это из-за настройки в web.config. Похоже, единственные строки, которые дают мне подсказку, основаны на: Request.RequestContext.HttpContext.Request.Url. Я возвращаюсь: localhost: 3737 / ErrorPage404.aspx? Aspxerrorpath = / fb / foo / bar Итак, я могу посмотреть значение aspxerrorpath, разделить его на / и посмотреть, равен ли нулевой элемент fb. Тогда сделайте Server.Transfer, если он есть. - person Armchair Bronco; 20.06.2011