ASP. NET MVC output custom 404 error page, not 302 jump

Source: Internet
Author: User

Friend asked a question, how to output a custom error page, do not use 302 jump. The current page address cannot be changed.

Also executes some code and so on, generates some error information, facilitates the user to submit the feedback.

500 errors, the MVC framework already has a ready-made workaround:

Filters. ADD (new Handleerrorattribute ());

404 errors Now think of the workaround:

First on the code global.asax:

 1 protected voidApplication_Error (Objectsender, EventArgs e)2         { 3             varex = Server.GetLastError () asHttpException;4             if(ex = =NULL) 5                 return; 6  7             varHttpStatusCode =Ex. Gethttpcode (); 8  9             if(HttpStatusCode = =404)Ten             { One                 varHttpContext = (Sender asmvcapplication). Context; A  -httpcontext.clearerror (); -httpContext.Response.Clear (); theHttpContext.Response.StatusCode =404; -ServiceFocus.LogService.AddLog (ex); -  -HttpContext.Response.ContentType ="text/html; Charset=utf-8"; +                 varRoutedata =NewRoutedata (); -routedata.values["Controller"] ="Sys"; +routedata.values["Action"] ="NotFound"; A                 varRequestContext =NewRequestContext (NewHttpcontextwrapper (HttpContext), routedata); at                 varController = ControllerBuilder.Current.GetControllerFactory (). Createcontroller (RequestContext,"Sys") asSyscontroller; -                 //Controller. Viewdata.model=model; -(Controller asIController). Execute (RequestContext); -ControllerBuilder.Current.GetControllerFactory (). Releasecontroller (Controller); -}
View Code

Controller code:
 1  Public classCompressattribute:actionfilterattribute2     { 3          Public Override voidonactionexecuting (actionexecutingcontext filtercontext)4         { 5             varacceptencoding = filtercontext.httpcontext.request.headers["accept-encoding"]; 6             if(!string. IsNullOrEmpty (acceptencoding))7             { 8Acceptencoding =acceptencoding.tolower ();9                 varResponse =FilterContext.HttpContext.Response;Ten                 if(Acceptencoding.contains ("gzip")) One                 { AResponse. Appendheader ("content-encoding","gzip"); -Response. Filter =NewGZipStream (response. Filter, compressionmode.compress); -                 } the                 Else if(Acceptencoding.contains ("deflate")) -                 { -Response. Appendheader ("content-encoding","deflate"); -Response. Filter =NewDeflatestream (response. Filter, compressionmode.compress); +                 } -             } +         } A     } at[Compress] -      Public classSyscontroller:controller -     { -         // -         //GET:/sys/ -  in          Publicactionresult NotFound () -         { to             returnView (); +         } -          Publicactionresult Error () the         { *             returnView (); $         }Panax Notoginseng}
View Code

Web. config

Enable the output error message, or ISS will not see the custom output error message when the external network request

<system.webServer>   </system.webServer>

At present, there are a few doubts, no drill: Also hope that users know that can dispel one or two, do not have to Google PA source.

1. If you do not add this line of code, the default output is: text/html; The browser directly outputs the content without parsing.

HttpContext.Response.ContentType = "text/html; Charset=utf-8 ";

2.iis does not use gzip compression, no matter how large the output 404 error page is, it is not automatically compressed. So use the following substitution method.

[Compress]    public class Syscontroller:controller

Guess:

MVC also does a lot of things after the execute phase of action, such as the 1, 2 points mentioned above. Normal 200 requests perform the default filter phase.

When a 404 request is made, these stages are skipped. Maybe 500 requests are similar.

Just a guess, not yet verified,

ASP. NET MVC output custom 404 error page, not 302 jump

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.