ASP.NET MVC рдкрд░ рдореВрд▓ 404 рддреНрд░реБрдЯрд┐ рдкреГрд╖реНрда

ASP.NET MVC рдкрд░ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдореЗрд░рд╛ рдЕрдкрдирд╛ 404 рддреНрд░реБрдЯрд┐ рдкреГрд╖реНрда рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЧрдпрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рдереА рдХрд┐ рдореИрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдХреБрдЫ рд╣реА рдорд┐рдирдЯреЛрдВ рдореЗрдВ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред 6 рдШрдВрдЯреЗ рдХреЗ рдХрд╛рдо рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рдЧреНрд░реА рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреАред рдиреАрдЪреЗ рд╡рд┐рд╡рд░рдгред

ASP.NET MVC 3 рдореЗрдВ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рд╡реИрд╢реНрд╡рд┐рдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдкреНрд░рдХрдЯ рд╣реБрдП рд╣реИрдВред рдПрдХ рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддреНрд░реБрдЯрд┐ рдкреГрд╖реНрда ( рд╣реИрдВрдбрд▓рд▓реАрдЯреНрд░реЗрдЯ рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдЕрджреНрднреБрдд рд╡рд┐рдзрд┐, рдХреЗрд╡рд▓ рдпрд╣ рдХреЛрдб 404 (рдкрд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛) рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдЗрд╕ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рд╕реБрдВрджрд░ рд╡рд┐рдХрд▓реНрдк рдХреА рддрд▓рд╛рд╢ рдХрд░рдиреА рдереАред

Web.config рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 404 рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ


ASP.NET рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо Web.config рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд░рд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХреЛрдб рдХреЛ system.web рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
<customErrors mode="On" > <error statusCode="404" redirect="/Errors/Error404/" /> </customErrors> 

рдпрджрд┐ 404 рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ yourite.ru/Errors/Error404/?aspxerrorpath=/Not/Found/Url рдкреГрд╖реНрда рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕реБрдВрджрд░ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ (рдЖрдк рдпреВрдЖрд░рдПрд▓ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ), рдпрд╣ рдПрд╕рдИрдУ рдХреЗ рд▓рд┐рдП рднреА рдмреБрд░рд╛ рд╣реИ - habr.ru рдкрд░ рдПрдХ рд▓реЗрдЦред
рд░рд┐рдбрд╛рдпрд░реЗрдореЛрдб = "ResponseRewrite" рдХреЛ customErrors рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рд╡рд┐рдзрд┐ рдХреЛ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 <customErrors mode="On" redirectMode="ResponseRewrite" > <error statusCode="404" redirect="/Errors/Error404/" /> </customErrors> 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреГрд╖реНрда рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЕрдиреБрд░реЛрдзрд┐рдд рддреНрд░реБрдЯрд┐ рдкрде рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреГрд╖реНрда рдХреА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреБрдЫ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рд╣реИрдВред ASP.NET MVC рдкрд░ рджрд┐рдП рдЧрдП рдлреЙрд░реНрдо рдореЗрдВ рдпрд╣ рд╡рд┐рдзрд┐ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рд╡рд┐рд╖рдп рдореЗрдВ рдПрдХ рдХрд╛рдлреА рд╡рд┐рд╕реНрддреГрдд рдЪрд░реНрдЪрд╛ (рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ) рдкрдврд╝реА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рд╡рд┐рдзрд┐ Server.Transfer рд╡рд┐рдзрд┐ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд╛рд╕рд┐рдХ ASP.NET рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЧрддрд┐рд╢реАрд▓ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд╕рд╛рде, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбрд┐рд╕реНрдХ рдкрд░ рдлрд╝рд╛рдЗрд▓ / рддреНрд░реБрдЯрд┐рдпрд╛рдБ / рддреНрд░реБрдЯрд┐404 / 'рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИ)ред рдпрд╣реА рд╣реИ, рдпрджрд┐ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП '/ рддреНрд░реБрдЯрд┐рдпрд╛рдБ / Error404 /' рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, '/' Errors/Error404.htm ', рддреЛ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХрд╛рдо рдХрд░реЗрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдХреНрд░рд┐рдпрд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧрд┐рдВрдЧред
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд┐рд╖рдп рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдерд╛:
 Response.TrySkipIisCustomErrors = true; 

рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗрд╡рд▓ IIS 7 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд╣рдо IIS 6 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЦреЛрдЬ рдЬрд╛рд░реА рд░рдЦрдирд╛ рдерд╛ред

рдПрдХ рдЯреИрдореНрдмреЛрд░рд┐рди рдФрд░ Application_Error рдХреЗ рд╕рд╛рде рдиреГрддреНрдп


рдпрджрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХреЛрдб рдХреА рдЕрдзрд┐рдХ рдкрдВрдХреНрддрд┐рдпрд╛рдВ рд▓рд┐рдЦрдиреА рд╣реЛрдВрдЧреАред рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдЖрдВрд╢рд┐рдХ рд╕рдорд╛рдзрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди "рдПрдХ рдЯреИрдореНрдмреЛрд░рд┐рди рдХреЗ рд╕рд╛рде" рдореБрдЭреЗ рд╡рд┐рд╖рдп рдореЗрдВ рдорд┐рд▓рд╛ред рдЪрд░реНрдЪрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдирд┐рд░реНрдгрдп рдХреЗ рдкрд╛рда рдХрд╛ рд░реВрд╕реА рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реВрдВрдЧрд╛ред
рдиреАрдЪреЗ 404 NotFound рддреНрд░реБрдЯрд┐ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реА рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рд╣реИрдВ:

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Global.asax рдореЗрдВ Application_Error рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдкрд╡рд╛рдж рдпрд╛ рд▓реЙрдЧрд┐рдВрдЧ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ 404 рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдореИрдВ 40 рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╕рднреА рдХреЛрдб рдХреЛ рдЧреНрд▓реЛрдмрд▓ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВред asaxред

рдЪрд░рдг 1: 404 рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдо рдЬрдЧрд╣ рдмрдирд╛рдПрдВ

рдЗрд╕рд╕реЗ рд╕рдорд░реНрдерди рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╣реЛрдЧреАред рд╣рдо рднрд╡рд┐рд╖реНрдп рдореЗрдВ 404 рдкреЗрдЬ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП ErrorController рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ 404 рдХреЛрдб рд▓реМрдЯрд╛рддрд╛ рд╣реИ!
 public class ErrorController : MyController {  #region Http404  public ActionResult Http404(string url)  {    Response.StatusCode = (int)HttpStatusCode.NotFound;    var model = new NotFoundViewModel();    //    ('NotFound' route),           model.RequestedUrl = Request.Url.OriginalString.Contains(url) & Request.Url.OriginalString != url ?      Request.Url.OriginalString : url;    //     Referrer  Request    model.ReferrerUrl = Request.UrlReferrer != null &&      Request.UrlReferrer.OriginalString != model.RequestedUrl ?      Request.UrlReferrer.OriginalString : null;    // TODO:   ILogger    return View("NotFound", model);  }  public class NotFoundViewModel  {    public string RequestedUrl { get; set; }    public string ReferrerUrl { get; set; }  }  #endregion } 


рдЪрд░рдг 2: рд╣рдо рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ 404 рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХреЗ рдФрд░ рд╣реИрдВрдбрд▓рд▓реАрдбреЙрдЧреНрд░реЗрд╢рди рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХреЗрдВ

ASP.NET MVC рдореЗрдВ рддреНрд░реБрдЯрд┐ 404 рдХреЛ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд╣рд▓рд╛ рд╣реИрдВрдбрд▓рдбреЗрдирдЧреЗрдВрд╢рди рд╣реИред
InvokeHttp404 рд╡рд┐рдзрд┐ ErrorController рдФрд░ рд╣рдорд╛рд░реЗ рдирдП рдмрдирд╛рдП рдЧрдП Http404 рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрдЧрд╣ рд╣реИред DRY рдХрд╛рд░реНрдпрдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ!
 public abstract class MyController : Controller { #region Http404 handling protected override void HandleUnknownAction(string actionName) { //   - ErrorController,       if (this.GetType() != typeof(ErrorController)) this.InvokeHttp404(HttpContext); } public ActionResult InvokeHttp404(HttpContextBase httpContext) { IController errorController = ObjectFactory.GetInstance<ErrorController>(); var errorRoute = new RouteData(); errorRoute.Values.Add("controller", "Error"); errorRoute.Values.Add("action", "Http404"); errorRoute.Values.Add("url", httpContext.Request.Url.OriginalString); errorController.Execute(new RequestContext( httpContext, errorRoute)); return new EmptyResult(); } #endregion } 


рдЪрд░рдг 3: рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛рд░рдЦрд╛рдиреЗ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ 404 HttpException рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ (рдЖрдкрдХреЛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ):
MVC1.0 рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг:
 public class StructureMapControllerFactory : DefaultControllerFactory { protected override IController GetControllerInstance(Type controllerType) { try { if (controllerType == null) return base.GetControllerInstance(controllerType); } catch (HttpException ex) { if (ex.GetHttpCode() == (int)HttpStatusCode.NotFound) { IController errorController = ObjectFactory.GetInstance<ErrorController>(); ((ErrorController)errorController).InvokeHttp404(RequestContext.HttpContext); return errorController; } else throw ex; } return ObjectFactory.GetInstance(controllerType) as Controller; } } 

MVC2.0 рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг:
  protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { try { if (controllerType == null) return base.GetControllerInstance(requestContext, controllerType); } catch (HttpException ex) { if (ex.GetHttpCode() == 404) { IController errorController = ObjectFactory.GetInstance<ErrorController>(); ((ErrorController)errorController).InvokeHttp404(requestContext.HttpContext); return errorController; } else throw ex; } return ObjectFactory.GetInstance(controllerType) as Controller; } 

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдирдХреА рдШрдЯрдирд╛ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ Application_Error рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдзрд┐ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
404 рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рджреВрд╕рд░рд╛ рд╕реНрдерд╛рди рд╣реИред

рдЪрд░рдг 4: рдЙрди рдорд╛рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП GlobalFasax рдореЗрдВ NotFound рдорд╛рд░реНрдЧ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛

рдЗрд╕ рдорд╛рд░реНрдЧ рдХреЛ Http404 рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ url рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рд╕рд╛рдкреЗрдХреНрд╖ рдкрддрд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд░реВрдЯрд┐рдВрдЧ рдЗрдВрдЬрди рдбреЛрдореЗрди рдирд╛рдо рдХреЗ рд╕рд╛рде рднрд╛рдЧ рдХреЛ рдХрд╛рдЯ рджреЗрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ рдЗрди рд╕рднреА рд╕рд╢рд░реНрдд рдмрдпрд╛рдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ред
  routes.MapRoute("NotFound", "{*url}", new { controller = "Error", action = "Http404" }); 

рдпрд╣ 404 рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдорд╡реАрд╕реА рдЖрд╡реЗрджрди рдореЗрдВ рддреАрд╕рд░рд╛ рдФрд░ рдЕрдВрддрд┐рдо рд╕реНрдерд╛рди рд╣реИ рдЬреЛ рдЖрдк рд╕реНрд╡рдпрдВ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣рд╛рдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдорд╛рд░реНрдЧ рдХреЛ рдХрд┐рд╕реА рднреА рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдореИрдк рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рдерд╛, рддреЛ MVC рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ ASP.NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо (Global.asax рдлрд╝рд╛рдЗрд▓ рдореЗрдВ) рд╕реЗ рдЖрдЧреЗ рдкрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдФрд░ рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдРрд╕рд╛ рд╣реЛред

рдЪрд░рдг 5: рдЕрдВрдд рдореЗрдВ, рд╣рдо рддреНрд░реБрдЯрд┐ 404 рдХрд╛ рдХрд╛рд░рдг рдмрдирддреЗ рд╣реИрдВ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм MyController рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣рдорд╛рд░реЗ рдЛрдг рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдПрдХ рдЕрдорд╛рдиреНрдп рдЖрдИрдбреА рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 // // GET: /Detail/ID public ActionResult Detail(int ID) { Loan loan = this._svc.GetLoans().WithID(ID); if (loan == null) return this.InvokeHttp404(HttpContext); else return View(loan); } 

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдХрдо рдХреЛрдб рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рдм рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдмрдирд╛рдП рд░рдЦрдирд╛, рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдпрд╣ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рджреВрд╕рд░реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп


рдФрд░ рдЕрдВрдд рдореЗрдВ: рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдк рдЙрд╕реЗ рдпрд╣рд╛рдБ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ - github.com/andrewdavey/NotFoundMvc ред

рдирд┐рд╖реНрдХрд░реНрд╖


рдордЬрд╝реЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдСрд░реНрдЪрд░реНрдб рдореЗрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рд╣реИрд░рд╛рди рдерд╛ рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ рдирд┐рд░рд╛рд╢ рдерд╛ - рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЛ рдирд╣реАрдВ рд╕рдВрднрд╛рд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рдЙрдирдХреЗ рдЕрдкрдиреЗ 404 рддреНрд░реБрдЯрд┐ рдкреГрд╖реНрда, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдорд╛рдирдХ рдмрди рдЧрдП рд╣реИрдВред

рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ, рдореИрдВрдиреЗ рд░реВрдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Web.config рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЬрдм рддрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ 404 рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рджреЗрдирд╛ рдЦрддрд░рдирд╛рдХ рд╣реИ - рдЖрдк рдХрднреА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЕрдВрдд рдореЗрдВ рдХрд░реАрдм, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдореИрдВ рджреВрд╕рд░рд╛ рд╕рдорд╛рдзрд╛рди рд▓рд╛рдЧреВ рдХрд░реВрдВрдЧрд╛ред

рд╕рдВрдмрдВрдзрд┐рдд рд▓рд┐рдВрдХ:
  1. ASP.NET, HTTP 404 рдФрд░ рдПрд╕рдИрдУ ред
  2. CustomErrors рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм RedirectMode = "ResponseRewrite" ред
  3. рдореИрдВ ASP.NET MVC рдореЗрдВ 404 рдХреЛ рдХреИрд╕реЗ рдареАрдХ рд╕реЗ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реВрдВ?
  4. ASP.NET MVC 3 рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рд╕рд╛рдЗрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐ ред
  5. ASP.NET MVC 404 рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ ред
  6. ASP.NET MVC рдореЗрдВ HandleUnognAction - рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ ред
  7. github.com/andrewdavey/NotFoundMvc

Source: https://habr.com/ru/post/In128315/


All Articles