整理ASP.NET MVC 5各種錯誤請求[401,403,404,500]的攔截及自定義頁面處理實例

http://2sharings.com/2015/asp-net-mvc-5-custom-404-500-error-hanlde

https://blog.csdn.net/yhyhyhy/article/details/51003683

?

?

ASP.NET MVC 5的開發中,服務器的各種錯誤[如:401(登錄授權驗證),403(禁止訪問),404(訪問頁面不存在),500(服務器內部錯誤)等]處理是必需考慮并解決的一個問題,如果不處理這些錯誤或者使用默認的錯誤頁面,那么用于用戶體驗來說就不是很友好了。嚴重的甚至可以暴露程序以及服務器的各種信息,給黑客以可乘之機。 網上關于ASP.NET MVC 5的服務器錯誤處理攔截問題沒有太全的總結和整理。今天用一個簡單實例來總結整理一下這方面的處理技巧。 首先是404頁面的處理,本示例利用Global.asax文件的Application_Error()方法來攔截,使用Server.GetLastError()方法獲取到服務器的最后一次錯誤作為HttpException,再根據httpException的GetHttpCode()方法獲取到的http狀態碼來處理404的頁面不存在的問題,Global.asax代碼如下:

protected void Application_Error(object sender, EventArgs e){Exception exception = Server.GetLastError();HttpException httpException = exception as HttpException; RouteData routeData = new RouteData(); routeData.Values.Add("controller", "Error"); switch (httpException.GetHttpCode()) { case 404: routeData.Values.Add("action", "HttpError404"); break; } Response.Clear(); Server.ClearError(); Response.TrySkipIisCustomErrors = true; IController errorController = new ErrorController(); errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); //Response.RedirectToRoute(new { controller = "Error", action = "HttpError404" }); }

以上的404錯誤處理是直接將事先制作好的HttpError404.cshtml視圖信息顯示在請求的頁面,如: asp-net-mvc-5-404-custom-handle-01 其次是401(未授權)頁面的攔截處理,本示例是創建了一個名為AuthorizeCheckAttribute屬性類,此類繼承至AuthorizeAttribute類,在AuthorizeCheckAttribute類中,重寫了HandleUnauthorizedRequest方法,我們中此方法中來處理所有需要授權但未授權訪問的請求,然后再在需要授權訪問的控制器或者Action上使用AuthorizeCheck屬性,AuthorizeCheckAttribute屬性類的代碼如下:

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) { base.HandleUnauthorizedRequest(filterContext); if (!filterContext.HttpContext.User.Identity.IsAuthenticated) { try { filterContext.Controller.TempData.Add("Alert", new Alert { Type = AlertType.Error, Message = "請登錄后訪問" }); } catch { } filterContext.Result = new ViewResult { TempData = filterContext.Controller.TempData, ViewName = "~/Views/Error/HttpError401.cshtml" }; //new RedirectResult("~/error/httperror401"); } }

需要授權訪問的Action如下:

    [AuthorizeCheck]public ActionResult UnAuthorize(){return View(); }

這樣,如果在未登錄授權的情況下訪問UnAuthorize這個Action,那么就會被攔截到。我們可以在攔截器里任意處理錯誤信息了,比如把錯誤記錄到日志等。 最后,我們來處理的服務器的500內部錯誤。首先創建一個名為CustomHandleErrorAttribute的自定義錯誤處理屬性類,此類繼承至HandleErrorAttribute類,在CustomHandleErrorAttribute類中重寫OnException方法,代碼如下:

public override void OnException(ExceptionContext filterContext){base.OnException(filterContext);Exception exception = filterContext.Exception;try { //TODO:寫錯誤日志 filterContext.Controller.TempData.Add("Alert", new Alert { Type = AlertType.Error, Message = exception.ToString() }); } catch { } filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; //filterContext.Result = new RedirectResult("~/error/httperror500"); filterContext.Result = new ViewResult { TempData=filterContext.Controller.TempData, ViewName = "~/Views/Error/HttpError500.cshtml" }; //var Result = this.View("Error", new HandleErrorInfo(exception, //filterContext.RouteData.Values["controller"].ToString(), //filterContext.RouteData.Values["action"].ToString())); //filterContext.Result = Result; }

以上代碼中,我們使用了filterContext.Result屬性來設置攔截到內部錯誤后的返回視圖名字和返回的信息。當然,在OnException這個重寫方法中,我們還可以處理日志等操作,根據自已需要來實現就行。寫好這個類后,我們再修改FilterConfig類的RegisterGlobalFilters的方法,如下:

public class FilterConfig{public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new CustomHandleErrorAttribute()); } }

當然,我們事先已經在Global.asax文件中注冊了全局攔截配置了,Application_Start代碼如下:

 protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }

好了,以上就是關于ASP.NET MVC 5中處理各種服務器錯誤的自定義頁面的操作,希望對你有所幫助。 如果你有更好的實現方法,也歡迎留言交流。 最后,我把本實例的代碼提供如下,點擊這里下載。

轉載于:https://www.cnblogs.com/LuoEast/p/8331280.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281325.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281325.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281325.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

url字符轉義

作者在做短鏈接功能時,url參數里帶了&字符,結果無法轉換。后來查了一下,發現可以用其它符號代替。下面是對應表 URL 中號表示空格 %2B 空格 URL中的空格可以用號或者編碼 %20 / 分隔目…

編輯器領域正發生變革?從面試看 Visual Studio Code 的崛起

Visual Studio Code(VS Code)的使用率在迅速上升,現在已經成為大多數工程師的首選編輯器,并似乎正迅速搶占其他頂級編輯的市場份額。Triplebyte 每周都會面試數百名工程師。在每次面試中,我們都會記錄面試者使用的編輯…

C#7.0 ref引用傳遞

1.概要在工作中大家用到引用類型是非常多的,大家都知道引用類型在使用過程中傳遞的是對象引用并不會發生整個對象復制。而值類型在傳遞的過程中就不一樣了,我曾經在編寫代碼時希望通過值類型來壓低應用程序的內存占用,在高并發的情況大量的對…

Vue+Axios同步請求

axios本身是沒有同步請求的,要實現同步請求,用到的是ES7的async和await ES7的異步特性async / await async用于聲明一個函數是異步的,await用于聲明在一個異步函數中等待語句執行完畢。也就是說await只能在async函數中使用。簡單示例如下&a…

關于vue執行打包后,如何在本地瀏覽問題

最近一個人在搗鼓vue,寫完項目后發現在npm run dev下可以正常訪問,bulid之后卻一片空白,查看console出現許多Failed to load resource: net::ERR_FILE_NOT_FOUND。恩,看了下網上評論找到了正確的方法 webpack.prod.conf.js 中outp…

ELFhash

字符串哈希算法(以ELFHash詳解) 更多字符串哈希算法請參考:http://blog.csdn.net/AlburtHoffman/article/details/19641123 先來了解一下何為哈希: 哈希表是根據設定的哈希函數H(key)和處理沖突方法將一組關鍵字映射到一個有限的地…

android面試詳解

前臺就是和用戶交互的進程 可見進程例如一個activity被一個透明的對話框覆蓋,該activity就是可見進程 服務:service進程 后臺一個activity按了home按鍵就是從前臺退回到后臺 標準模式:不管任務棧是否存在相同的activity都會創建一個新的activ…

element-ui Notification重疊問題,原因及解決辦法

在1個方法中調用兩次this.$notify方法,會出現通知框重疊的問題 methods: {checkLogin: function () {if (this.username ) {this.$notify({title: 提示,message: 請輸入用戶名})}if (this.password ) {this.$notify({title: 提示,message: 請輸入用戶密碼})}}}網上…

Visual Stiudio使用技巧

技巧1 自動生成帶參構造函數當我們在編寫代碼時會經常遇到初始化一個的類,需要通過構造函數進行對象初始化。那么這個時候我們可能會需要逐個去手動寫,這樣的工作即重復又無趣。如果是在項目非常緊急的情況下還有大量的字段需要與入參一一對應起來簡直太…

js將時間戳格式化為HH:ii:ss的格式

將時間戳格式化為 HH:ii:ss的格式 <html> <head> </head> <body><span id"time"></span><script>var timestamp Date.parse(new Date())/1000;var time_old Date.parse(new Date())/1000;timeAdd()/*** purpose : …

Struts 整合 SpringMVC

Struts 整合 SpringMVC 過程&#xff1a;這篇文章是我在整合過程中所做的記錄和筆記 web.xml &#xff1a;篩選器機制過濾 原機制是攔截了所有 url &#xff0c;即 <url-pattern>/*</url-pattern>新機制為了將 structs2 的 url 與 SpringMVC 的 url 區分開來&#…

Vue保持用戶登錄及權限控制

vue-router-power-demo 核心內容有兩點&#xff1a; 一是保持用戶登錄狀態&#xff0c;二是根據登錄用戶的角色動態掛在路由 使用vuex保持用戶登錄 點擊登錄按鈕&#xff0c;使用vuex的actions分發登錄操作&#xff0c;發送用戶名和密碼到后臺獲取登錄token&#xff0c; 并存…

java B2B2C Springcloud多租戶電子商城系統-Spring Cloud Sleuth

在微服務框架中&#xff0c;一個由客戶端發起的請求在后端系統中會經過多個不同的的服務節點調用來協同產生最后的請求結果&#xff0c;每一個前段請求都會形成一條復雜的分布式服務調用鏈路&#xff0c;鏈路中的任何一環出現高延時或錯誤都會引起整個請求最后的失敗。 愿意了解…

C#性能測試BenchmarkDotnet

1.簡介在我們開發高性能代碼時&#xff0c;需要各種針對性能優化進行編碼。那么如何才能知道我們所加的代碼是否有性能方面的正向優化呢&#xff1f;有了BenchmarkDotNet&#xff0c;做性能對比測試就非常容易了&#xff0c;只需要把你的測試方法加上特性[Benchmark], 想做不同…

Requests獲取連接的IP地址

在接口自動化的時候&#xff0c;需要獲取到連接的本地IP地址&#xff0c;方法如下 1 import requests 2 3 rsp requests.get("http://www.baidu.com", streamTrue) 4 print rsp.raw._connection.sock.getpeername()[0] 5 print rsp.raw._connection.sock.getsockna…

阿里云APP(V4.3) SSH遠程登錄功能設置操作指南

阿里云APP V4.3 發布了&#xff0c;這次的升級&#xff0c;不僅在iOS和android平臺上支持SSH遠程登錄ECS功能&#xff0c;也支持密鑰登錄哦~~~ SSH遠程登錄&#xff0c;這是一個連阿里巴巴自己的技術人員都開心不已的功能&#xff01; 各位攻城獅們&#xff0c;從更新到V4.3的那…

JS專題之節流函數

本文共 2000 字&#xff0c;讀完只需 8 分鐘上一篇文章講了去抖函數&#xff0c;然后這一篇講同樣為了優化性能&#xff0c;降低事件處理頻率的節流函數。 一、什么是節流&#xff1f; 節流函數&#xff08;throttle&#xff09;就是讓事件處理函數&#xff08;handler&#xf…

vue 2.6 插槽v-slot用法記錄

v-slot用法簡記用法示例匿名插槽與具名插槽插槽作用域組件使用插槽動態命名總結用法示例 vue2.6統一了插槽的語法v-slot 匿名插槽與具名插槽 在其他組件中使用child組件 <child><template v-slot:slotName>hello world</template> </child>child組…

Latex排版全解(轉)

Latex排版全解 http://blog.csdn.net/langb2014/article/details/51354238轉載于:https://www.cnblogs.com/yifdu25/p/8338399.html

git-ftp Can't access remote 'ft://...', exiting...問題記錄

環境 服務器&#xff1a;西部數碼虛擬主機 本地系統&#xff1a;windows 10 (LTSC 2019) 軟件&#xff1a; Git Bash&#xff0c;gti-ftp (版本1.6.0) 問題 在使用git ftp init初始化上傳代碼的時候會出現 $ git ftp init fatal: Cant access remote ftp://dmkt:***dmkt.goto…