WebHU - Programozási kérdések és válaszok

Nem lehet átirányítani egyéni hibaoldalakra

Egyéni oldalra próbálok átirányítani, ha hiba történik. Így a Web.Config-hez hozzáadtam a következő kódot

    <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Views/Error/Error500.cshtml">
          <error statusCode="404" redirect="~/Views/Error/Error404"/>
          <error statusCode="500" redirect="~/Views/Error/Error500"/>
    </customErrors>
  </system.web>
    <system.webServer>
        <httpErrors errorMode="Custom" existingResponse="Replace">
          <remove statusCode="404" subStatusCode="-1" />
          <error statusCode="404" path="~/Views/Error/Error404" responseMode="ExecuteURL" />
          <remove statusCode="500" subStatusCode="-1" />
          <error statusCode="500" path="~/Views/Error/Error500" responseMode="ExecuteURL" />
        </httpErrors>

De amikor megpróbálom a localhost:23920/aFakeURl-t, átirányít egy üres oldalra, és nem éri el a ErrorController-omat.

Ha megpróbálom a localhost:23920/Error/Error404, bemegy a vezérlőmbe

// GET: /Error/Error404
public ActionResult Error404()
{
   Response.StatusCode = 404;
   return View();
}

akkor egy statusCode 404-et ad vissza, és az IIS nem tud vele mit kezdeni, és üres oldalt ad. Tehát egészen biztos vagyok benne, hogy a probléma a Web.Config-ban lévő elérési út.

megpróbáltam

  • ~/Views/Error/Error404"
  • ~/Views/Error/Error404.cshtml"
  • /Views/Error/Error404"
  • /Views/Error/Error404.cshtml"

Érdemes megemlíteni, hogy ha az elérési útnak nincs ~ értéke, akkor üres oldal helyett futásidejű kivételt ad vissza.

Szóval lenne 2 kérdésem.

  1. Mi a helyes módja a Web.Config írásának?
  2. Vissza kell adnom a megfelelő állapotkódot, mint ez Response.StatusCode = 404; a ErrorController-ben?

Köszönöm

Nem tudom, jó-e megemlíteni, de én a Elmah-et használom hibakezelésre és naplózásra. Fogalmam sincs, hogy van-e valami köze ehhez a problémához, de azt olvastam a dokumentációjukban, hogy működnie kell a mode="On"-al. Van-e jobb módja ennek az egésznek?

SZERKESZTÉS

Most ezt használom

    <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/Error/Error500">
      <error statusCode="404" redirect="/Error/Error404"/>
      <error statusCode="500" redirect="/Error/Error500"/>
    </customErrors>
  </system.web>
  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Replace">
      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="404" path="/Error/Error404" responseMode="ExecuteURL" />
      <remove statusCode="500" subStatusCode="-1" />
      <error statusCode="500" path="/Error/Error500" responseMode="ExecuteURL" />
    </httpErrors>

de mindig 500-as hibát ad vissza, ha rossz URL-t írok be.

A kivétel System.Web.HttpException: The controller for path '/aBadUrllllll' was not found or does not implement IController.

Miért nem ad vissza 404-es hibát?

Változtatnom kell valamit a Route.config fájlban?


  • próbálkozzon defaultRedirect = ~/Error/Error404. Szerintem a cselekvésre kell irányítani, nem a fizikai útra 07.03.2014
  • Ugyanez vonatkozik a customError-ra is? Még mindig van egy üres oldalam :( 07.03.2014
  • a redirect=~/Views/Error/Error404-et is akcióra frissítetted? 07.03.2014
  • Igen. Minden a ~/Error/Error404-hez 07.03.2014
  • ennek köze lehet a redirectMode=ResponseRewrite-hez. ben.onfabrik.com/posts/aspnet-mvc-custom-error- oldalak 07.03.2014
  • Még mindig van egy üres oldalam, amikor eltávolítom a redirectMode-ot és a meglévő választ 07.03.2014
  • Mi van, ha ez egy futásidejű kivétel, ahogy mondja... 08.03.2014
  • Redirect=/Error/Error404 esetén működik, de mindig 500-as hibát ad vissza 08.03.2014
  • A címkék kiválasztásakor mindig olvassa el a megjelenő leírásokat! 08.03.2014
  • @Charles Hogy érted ezt? Melyik címke hibás? 08.03.2014
  • @Marc, Ön egy elírási hibát tartalmazó címkét használt, és egy leírással, amely jelzi, hogy melyik címkét használja helyette. kijavítottam a hibát. 08.03.2014

Válaszok:


1

Rendben van a címke elhelyezése: meg kell adni az általános hibakódokat és oldalakat is, például:

<system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Auto">
      <remove statusCode="403" subStatusCode="14"/>
      <error statusCode="403" subStatusCode="14" responseMode="ExecuteURL"
path="/App/Error/Forbidden"/>
      <remove statusCode="404"/>
      <error statusCode="404" responseMode="ExecuteURL" path="/App/Error/NotFound"/>
    </httpErrors>... 

Emlékezz, létrehozza a NotFound oldalt a vezérlőben Hiba!

07.03.2014
  • Ez a customErrors mode=On szekcióval együtt működött! 19.06.2017

  • 2

    Hasonló problémáim voltak, és végül megoldódott azáltal, hogy a következők mindegyikét megtettem:

    1) A customErrors mode="On" be van állítva a web.config fájlban

    2) Létrehozott egy ErrorController-t olyan műveletekkel, amelyek egyedi hibaoldalt igényelnek.

    e.g.

        [AllowAnonymous]
        public virtual ActionResult NotFound(string message = "")
        {
            HttpContext.Response.StatusCode = 404;
            return View();
        }
    

    3) Létrehozott egy Filter.config fájlt a HandleErrorAttribute hozzáadásához, és elhívta ezt a metódust az alkalmazásindításban a global.asax fájlban.

        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    

    4) Globális hibakezelő hozzáadva a global.asax fájlhoz. Íme egy hiányos minta belőle.

        void Application_Error(object sender, EventArgs e)
        {
            var exception = Server.GetLastError();
            Response.Clear();
    
            var httpException = exception as HttpException;
    
            if (httpException != null)
            {
                var action = string.Empty;
    
                switch (httpException.GetHttpCode())
                {
                    case 401:
                        action = "Unauthorized";
                        break;
                    case 403:
                        action = "Forbidden";
                        break;
                    case 404:
                        action = "NotFound";
                        break;
                    case 500:
                        action = "ServerError";
                        break;
                    default:
                        action = "ServerError";
                        break;
                }
    
                Server.ClearError();
    
                Response.Redirect(string.Format("~/Error/{0}/?message={1}", action, exception.Message));
            }
    
            Logger.Error("Unhandled website exception", exception);
        }
    

    Ha mindez a helyén van, akkor a kemény kivételeket és a szándékos átirányításokat is megfelelően kezeljük. Például azokban az esetekben, amikor bejelentkezéskor nem teljesült egy üzleti szabály, amely megakadályozta a felhasználót a folytatásban, ez megtörtént.

    return RedirectToAction("Illetéktelen", "Hiba", new { message = "Fiókja nem használhatja ezt a funkciót." });

    Egy jó tanács azonban az, hogy a 401-es hiba visszaadása azt eredményezi, hogy nem jelenik meg a hibaoldal, és a bejelentkezési oldalra kerül, hacsak nem kezeli megfelelően. Biztos vagyok benne, hogy ezt egy másik bejegyzésben kifejtik.

    Még egy dolog, és ezt csak most fedeztem fel, amikor telepítettem a legújabbat a Dev és UAT környezetünkre. A helyi IIS-ben jól láttam az egyéni hibaoldalakat, más környezetekben viszont az alapértelmezett IIS-oldalakat. Az ErrorControllerhez való irányítás jól működött, de az egyéni oldalak továbbra sem jelennek meg. Kiderült, hogy szükségem volt erre a web.config bejegyzésre

    httpErrors létezőResponse="PassThrough"

    system.webServer alatt, aminek most van értelme.

    21.08.2014
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..