瀏覽器到網站程式 上一篇中,介紹IHttpModule的時候,自定義一個類CustomHttpModule繼承自IHttpModule,自定義一個事件,並配合配置文件,就可以執行自定義Module中的Init方法。我們在瀏覽一個View視圖,並新建一個WebForm頁面,也瀏覽一下 我們可以看出來, ...
瀏覽器到網站程式
上一篇中,介紹IHttpModule的時候,自定義一個類CustomHttpModule繼承自IHttpModule,自定義一個事件,並配合配置文件,就可以執行自定義Module中的Init方法。我們在瀏覽一個View視圖,並新建一個WebForm頁面,也瀏覽一下
我們可以看出來,不管是MVC還是WebForm,頁面解析都是在PreRequestHandler和PostRequestHandler之間。
配置文件指定映射關係:
尾碼名與處理程式的關係(IHttpHandler----IHttpHandlerFactory),Http任何一個請求一定是由某一個具體的Handler來處理的,不管成功還是失敗,以前寫aspx,感覺請求訪問的是物理地址,其實不然,請求的處理是框架處理的。
所謂管道處理模型,其實就是後臺如何處理一個Http請求,定義多個事件完成處理步驟,每個事件可以擴展動作(HttpModule),最後有個HttpHandler完成請求的處理,這個過程就是管道處理模型,還有一個全局的上下文環境,無論參數,中間結果,最終結果,都保存在其中。
直播平臺--網頁播放--jwplayer--需要一個配置文件.rtmp
在臨時文件夾生成一個文件.rtmp 然後配置一下文件mine,當成物理文件訪問---臨時生成---還得刪除
客戶端要的是內容---先保存硬碟---返迴文件流
如果能直接動態響應 .rtmp
我們可以從請求級出發,避開預設機制
public class CustomRTMPHandler : IHttpHandler { public bool IsReusable => true; public void ProcessRequest(HttpContext context) { context.Response.Write("This is AAAA"); context.Response.ContentType = "text/html"; } }
盜鏈:A網站通過B網站資源展示圖片
防盜鏈:B不允許盜鏈請求頁面時會檢測一下urlreferer(瀏覽器行為),在白名單裡面就正常返回,否則就不正常返回(返回一個授權圖片)
public class ImageHandler : IHttpHandler { #region IHttpHandler Members public bool IsReusable { get { return true; } } public void ProcessRequest(HttpContext context) { // 如果UrlReferrer為空,則顯示一張預設的禁止盜鏈的圖片 if (context.Request.UrlReferrer == null || context.Request.UrlReferrer.Host == null) { //大部分都是爬蟲 context.Response.ContentType = "image/JPEG"; context.Response.WriteFile("/Content/Image/Forbidden.jpg"); } else { // 如果 UrlReferrer中不包含自己站點主機功能變數名稱,則顯示一張預設的禁止盜鏈的圖片 if (context.Request.UrlReferrer.Host.Contains("localhost")) { // 獲取文件伺服器端物理路徑 string FileName = context.Server.MapPath(context.Request.FilePath); context.Response.ContentType = "image/JPEG"; context.Response.WriteFile(FileName); } else { context.Response.ContentType = "image/JPEG"; context.Response.WriteFile("/Content/Image/Forbidden.jpg"); } } } #endregion }
public class ImageHandlerFactory : IHttpHandlerFactory { public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated) { string path = context.Request.PhysicalPath; if (Path.GetExtension(path).Equals(".gif")) { return new ImageHandler(); } else if (Path.GetExtension(path) == ".png") { return new ImageHandler(); } else { return new ImageHandler(); } } public void ReleaseHandler(IHttpHandler handler) { } }
配置文件
<system.webServer> <!--集成模式使用這個--> <handlers> <!--<add name="config" verb="*" path="*.config" type="System.Web.StaticFileHandler"/>--> <!--帶會兒留個後門--> <add name="rtmp" verb="*" path="*.rtmp" type="MyMVCDemo.Pipeline.CustomRTMPHandler,MyMVCDemo.MVC5"/> <add name="gif" path="*.gif" verb="*" type="MyMVCDemo.Web.Core.PipeLine.ImageHandler,MyMVCDemo.Web.Core" /> <add name="png" path="*.png" verb="*" type="MyMVCDemo.Web.Core.PipeLine.ImageHandler,MyMVCDemo.Web.Core" /> <add name="jpg" path="*.jpg" verb="*" type="MyMVCDemo.Web.Core.PipeLine.ImageHandler,MyMVCDemo.Web.Core" /> <add name="jpeg" path="*.jpeg" verb="*" type="MyMVCDemo.Web.Core.PipeLine.ImageHandler,MyMVCDemo.Web.Core" /> </handlers> <modules>View Code
自定義Handler處理,就是跨域處理各種尾碼請求,跨域加入自己的邏輯,如果沒有,請求都到某個頁面,再傳參,然後返回圖片,防盜鏈,偽靜態,RSS,加水印,robot(爬蟲)
MVC裡面不是Controller+Action?其實是有MVCHandler來處理請求的,期間完成對ACtion的調用
網站啟動時,對RouteCollection進行配置,把正則規則和RouteHandler(提供HttpHandler)綁定,放入RouteCollection,請求來臨時,用RouteCollection進行匹配。在UrlRoutingModule這個勒中
如果路由匹配失敗,還是繼續原始的Asp.NET 流程,所以WebForm和MVC是共存的,所以也能解釋指定尾碼請求需要路由的忽略。
按照添加順序進行匹配,第一個溫和,就直接返回了,後面的就無效了。路由是按照註冊順序進行匹配,遇到第一個溫和的就結束匹配,每個請求只會被一個路由匹配上
其實所謂的MVC框架,其實就是在ASP.NET管道上擴展的,在PostResolveCache事件擴展了,URLRoutingModule,會在任何請求進來後,先進行路由匹配,如果匹配上了,就指定HttpHandler,沒有路由匹配就還是走原來的流程。
擴展自己的Route,寫入RouteCollection,可以自定義規則完成路由,擴展HttpHandler,就可以為所欲為,跳出MVC框架