Как да замените настройките на 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 понякога референтът е нулев, така че се уверете, че се справяте с това

person kleinohad    schedule 20.06.2011
comment
Вижте коментара по-долу за това, че UrlReferrer е нулев. - 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(), тъй като искаме munged URL да бъде видим. Server.Transfer зачита новия URL адрес, но показва оригиналния. - person Armchair Bronco; 20.06.2011

„Facebook mode“ изглежда като нещо, което можете да проследите в 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?

person dahlbyk    schedule 20.06.2011
comment
Значи казвате, че трябва просто да оставя пренасочването от web.config да се случи и след това да направя друго пренасочване или server.transfer() от ErrorPage.aspx, ако съм във Facebook режим? - person Armchair Bronco; 20.06.2011
comment
Всъщност ние изобщо не използваме Session в нашето приложение. Изключено е, така че това не е опция за нас. - 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
Мислех за грешка на страницата, но проблемът е, че грешката some няма да се появи на страница. Например, мога да принудя 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 или да запазя генерирания от ASP.NET QueryString непокътнат. - person Armchair Bronco; 20.06.2011

Лесният начин да го направите е да използвате сесия, но ако не използвате сесия на уебсайта си, винаги можете да използвате бисквитка и когато потребителят стигне до страницата за грешка, прегледайте бисквитката и решете дали искате да го пренасочите към нова страница за грешка

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