網站首頁 編程語言 正文
1、定義路由、路由規則
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
路由是什么?
Route派生于RouteBase基類,如下:
路由能提供什么?
● 通過路由的GetRouteData()方法,獲取到封裝路由信息的RouteData類型;
● 通過路由的Constraints屬性獲取路由約束;
......
MapRoute()是RouteCollection的擴展方法:
RouteCollection是什么?
RouteCollection是RouteBase的集合類。
2、注冊路由規則
在全局文件中注冊路由規則:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
......
RouteConfig.RegisterRoutes(RouteTable.Routes);
......
}
}
原來,所有的路由規則都存放在RouteTable中類型為RouteCollection的Routes屬性中了。
3、UrlRoutingModule處理url請求,輸出MvcHandler以處理HTTP請求
UrlRoutingModule實現IHttpModule接口,對HttpApplication的PostResolveRequest事件進行偵聽:
public class UrlRoutingModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.PostResolveRequestCache += OnPostResolveRequestCache;
}
portected virtual void OnPostResolveRequestCache(object sender, EventArgs e)
{
//把當前上下文封裝
HttpContextWrapper httpContext = new HttpContextWrapper(HttpContext.Current);
//獲取當前請求中的RouteData類型
RouteData routeData = RouteTable.Routes.GetRouteData(httpContext);
if(routeData == null)
{
return;
}
//把routeData再封裝起來
RequestContext requestContext = new RequestContext{
RouteData = routeData,
HttpContext = httpContext
};
//從RouteData的RouteHandler屬性獲取IRouteHandler類型
//IRouteHandler的GetHttpHandler()方法獲取IHttpHandler
IHttpHandler handler = routeData.RouteHandler.GetHttpHandler(requestContext);
//為當前上下文設置HttpHandler,用于對當前HTTP請求的處理
httpContext.RemapHandler(handler);
}
}
IRouteHandler是什么?
他的唯一職責是生產IHttpHandler實例。
public interface IRouteHandler
{
IHttpHandler GetHttpHandler(RequestContext requestContext);
}
在MVC中默認使用的是MvcRouteHandler,是IRouteHandler的實現,返回類型為IHttpHandler的MvcHandler:
public class MvcRouteHandler : IRouteHander
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MvcHandler(requestContext);
}
}
MvcHandler是MVC中IHttpHandler的默認實現
public class MvcHandler : IHttpHandler
{
publci bool IsReusable{get {return false;}}
public RequestContext RequestContext{get; private set;}
public MvcHandler(RequestContext requestContext)
{
this.RequestContext = requestContext;
}
public void ProcessRequest(HttpContext context)
{
string controllerName = this.RequestContext.RouteData.Controller;
IControllerFactory controllerFactory = COntrollerBuilder.Current.GetControllerFactory();
IController controller = controllerFactory.CreateController(this.RequestContext, controllerName);
controller.execute(this.RequestContext);
}
}
原文鏈接:https://www.cnblogs.com/darrenji/p/3816945.html
相關推薦
- 2022-06-13 C#多線程之Parallel類的用法_C#教程
- 2022-09-01 深入了解Golang的指針用法_Golang
- 2022-07-18 SpringBoot之定時任務三種實現方法
- 2022-05-12 前端在線預覽 tiff 格式的圖片
- 2022-07-28 使用正則表達式從鏈接中獲取圖片名稱_正則表達式
- 2023-01-05 Kotlin啟動協程的三種方式示例詳解_Android
- 2023-07-09 .Net下驗證MongoDB 的 Linq 模式聯合查詢是否可用
- 2022-07-26 go通過channel獲取goroutine的處理結果
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支