当前位置: 首页 > news >正文

小店网站怎么做网站服务器在本地是指

小店网站怎么做,网站服务器在本地是指,wordpress升级提示文件流的目标,石家庄新华区网站建设阅读目录 一、MVC原理解析 1、MVC原理二、HttpHandler 1、HttpHandler、IHttpHandler、MvcHandler的说明2、IHttpHandler解析3、MvcHandler解析三、HttpModule 1、HttpModule能干什么2、HttpModule的使用3、HttpModule和HttpHandler如何区分4、UrlRoutingModule解析 四、总结正… 阅读目录 一、MVC原理解析 1、MVC原理二、HttpHandler 1、HttpHandler、IHttpHandler、MvcHandler的说明2、IHttpHandler解析3、MvcHandler解析三、HttpModule 1、HttpModule能干什么2、HttpModule的使用3、HttpModule和HttpHandler如何区分4、UrlRoutingModule解析 四、总结   正文 前言最近一段时间在学习MVC源码说实话研读源码真是一个痛苦的过程好多晦涩的语法搞得人晕晕乎乎。这两天算是理解了一小部分这里先记录下来也给需要的园友一个参考奈何博主技术有限如有理解不妥之处还希望大家斧正博主感激不尽 本文原创地址http://www.cnblogs.com/landeanfen/p/5989092.html MVC源码学习系列文章目录 MVC系列——MVC源码学习打造自己的MVC框架一MVC系列——MVC源码学习打造自己的MVC框架二附源码MVC系列——MVC源码学习打造自己的MVC框架三自定义路由规则MVC系列——MVC源码学习打造自己的MVC框架四自定义视图回到顶部 一、MVC原理解析  最近园子里Asp.Net Core火了一阵不管微软的开源动作有多么迟缓还是希望微软能够给力一次。作为Core的主要Web框架——MVC虽然已经开源但是读起来着实费劲并且感觉很多核心部件都找不到。于是只能通过Reflector去反编译MVC5的组件以及参考博客园Fish Li等大神的文章去学习下MVC5的原理。 10月26日更新感谢园友Adming在评论中提醒原来Asp.net Core Mvc和Asp.net Mvc 5的原理已经完全不同难怪在Core Mvc的源码里面已经找不到MvcHandler、UrlRoutingModule等核心部件了呢此系列文章就先学习下MVC5的原理等以后有空了再来研究Core MVC吧。 Asp.Net Core MVC的开源地址https://github.com/aspnet/Mvc Asp.net MVC的开源地址http://aspnetwebstack.codeplex.com/SourceControl/latest 回到顶部 1、MVC原理 之前的文章有介绍MVC的路由机制其实路由机制算是MVC的原理的核心之一。在此我们还是要不厌其烦再来谈谈整个过程因为这是理解MVC原理不可逾越的鸿沟。当我们收到一个URL的请求时服务端收到请求主要经历以下几个步骤 请求被UrlRoutingModule部件拦截封装请求上下文HttpContext成为HttpContextWrapper对象。根据当前的HttpContext从Routes集合中得到与当前请求URL相符合的RouteData对象。将RouteData与HttpContext请求封装成一个RequestContext对象。根据RequestContext对象从RouteData的RouteHandler中获取IHttpHandlerMVC里面会有一个IHttpHandler的实现类MvcHandler。执行IHttpHandlerMvcHandler然后就是通过反射激活具体的controller执行具体的action。附上一张大致的流程图 纵观整个过程看上去很复杂各种对象缠绕看得人晕晕的。其实如果你静下心来仔细研读MVC的源码你会发现其实并没有想像中的那般复杂请有点耐心听博主慢慢道来。 1、整个过程有两个核心的组件文中博主用红色标记了出来UrlRoutingModule和MvcHandler上文提到的各个过程都和两个组件有紧密的联系。而这两个组件分别继承至IHttpModule和IHttpHandler接口熟悉Asp.net管线事件的朋友应该会记得这两个接口在管道事件里面这两个接口扮演着重要角色。要理解MVC的上述原理必须要先理解这两类接口的原理以及使用。 2、UrlRoutingModule的作用可以理解为通过一系列的与路由相关的组件去解析当前请求的Controller与Action名称其实简单点理解比如我们请求http://localhost:8080/Home/Index这个url的时候UrlRoutingModule拦截到这个请求然后通过一系列的方式得到这里的“Home”和“Index”这样理解有没有简单一点呢。 3、MvcHandler的作用就更加直接上述通过拦截组件得到了请求的Controller和Action的名称MvcHandler组件将当前请求的Controller名称反射得到对应的控制器对象然后执行对应的Action方法。比如还是上述http://localhost:8080/Home/Index这个请求通过字符串“Home”反射成为Home这个类型的控制器对象然后调用这个对象的Index()方法。 4、综上联合这两个组件来理解UrlRoutingMudule组件的主要作用是解析当前的Controller与Action名称MvcHandler的作用是将得到的Controller名称激活得到具体的Controller对象然后执行对应的Action方法。 所以要理解MVC的原理必须要了解这两个组件的基本原理以及作用。下面就根据这两个组件分别展开说明相信理解了下面的内容你对mvc的原理会有一个新的认识。 回到顶部 二、HttpHandler 上文说过MvcHandler是继承至IHttpHandler接口的为什么这里大标题会用HttpHandler而不是MvcHandler呢因为博主觉得HttpHandler实在是太重要了首先得理解了HttpHandler这么一个大的东西然后再来看具体的MvcHandler才有意义。 回到顶部 1、HttpHandler、IHttpHandler、MvcHandler的说明 HttpHandler指所有实现IHttpHandler接口一类类型的统称它是一个大的称谓。这些类型有一个共同的功能那就是可以用来处理Http请求。IHttpHandler是微软定义的一类接口用来约束所有能够处理Http请求的类型的接口规则。MvcHandler是Mvc里面实现IHttpHandler接口的类型也就是说MvcHandler是Mvc里面处理Http请求的类型。总而言之HttpHandler只是一个逻辑称谓它并不具体存在。而IHttpHandler和MvcHandler是.net framework里面具体存在的接口和实现类是前者的表现形式。 回到顶部 2、IHttpHandler解析  2.1、Asp.net管线事件简易说明 做过Webform开发的园友应该记得在asp.net的页面生命周期里面一共有24个管线事件完整的管线事件可参考MSDN文档 在处理该请求时将由 HttpApplication 类执行以下事件。 希望扩展 HttpApplication 类的开发人员尤其需要注意这些事件。 1. 对请求进行验证将检查浏览器发送的信息并确定其是否包含潜在恶意标记。 有关更多信息请参见 ValidateRequest 和脚本侵入概述。 2. 如果已在 Web.config 文件的 UrlMappingsSection 节中配置了任何 URL则执行 URL 映射。 3. 引发 BeginRequest 事件。 4. 引发 AuthenticateRequest 事件。 5. 引发 PostAuthenticateRequest 事件。 6. 引发 AuthorizeRequest 事件。 7. 引发 PostAuthorizeRequest 事件。 8. 引发 ResolveRequestCache 事件。 9. 引发 PostResolveRequestCache 事件。 10. 根据所请求资源的文件扩展名在应用程序的配置文件中映射选择实现 IHttpHandler 的类对请求进行处理。 如果该请求针对从 Page 类派生的对象页并且需要对该页进行编译则 ASP.NET 会在创建该页的实例之前对其进行编译。 11. 引发 PostMapRequestHandler 事件。 12. 引发 AcquireRequestState 事件。 13. 引发 PostAcquireRequestState 事件。 14. 引发 PreRequestHandlerExecute 事件。 15. 为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法或异步版 IHttpAsyncHandler.BeginProcessRequest。 例如如果该请求针对某页则当前的页实例将处理该请求。 16. 引发 PostRequestHandlerExecute 事件。 17. 引发 ReleaseRequestState 事件。 18. 引发 PostReleaseRequestState 事件。 19. 如果定义了 Filter 属性则执行响应筛选。 20. 引发 UpdateRequestCache 事件。 21. 引发 PostUpdateRequestCache 事件。 22. 引发 EndRequest 事件。 23. 引发 PreSendRequestHeaders 事件。 24. 引发 PreSendRequestContent 事件。 这里不可能把每个管线事件将清楚但是在整个管线事件中有两个重要的角色就是HttpHandler和HttpModule。在这些事件中第10个事件【根据所请求资源的文件扩展名在应用程序的配置文件中映射选择实现 IHttpHandler 的类对请求进行处理】 是HttpHandler创建的地方。关于WebForm里面HttpHandler创建的详细过程这里就不展开说了如果有兴趣可以参考http://www.cnblogs.com/fish-li/archive/2012/01/29/2331477.html。 2.2、Asp.net中常见的HttpHandler类型 首先还是来看看IHttpHandler的定义 public interface IHttpHandler {// 定义一个处理当前http请求的方法void ProcessRequest(HttpContext context); // 指示当前实例是否可以再次使用 bool IsReusable { get; } } 接口的定义很简单ProcessRequest()方法里面传一个当前请求的上下文对象去处理当前的http请求。 为了处理异步请求Framework里面还定义了一个异步的IHttpHandler接口 public interface IHttpAsyncHandler : IHttpHandler {// MethodsIAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData); void EndProcessRequest(IAsyncResult result); } 接口的两个方法应该也不难理解。 我们已经说了HttpHandler的主要作用是处理http请求原来在做webform的时候应该都写过后缀ashx的一般处理程序吧这个一般处理程序就是通过实现IHttpHandler接口去实现的。我们是否曾经也写过类似这样的代码新建一个TestHttpHandler.ashx文件代码如下 public class TestHttpHandler : IHttpHandler{public void ProcessRequest(HttpContext context) { context.Response.ContentType text/plain; var username context.Request.QueryString[username]; var password context.Request.QueryString[password]; if (username admin password admin) { context.Response.Write(用户admin登录成功); } else { context.Response.Write(用户名或者密码错误); } } public bool IsReusable { get { return false; } } } 然后运行通过http://localhost:16792/TestHttpHandler.ashx?usernameadminpasswordadmin去访问一般处理程序即可得到正确的结果。 当然除了这个还有我们最常见的aspx页面。 public partial class TestPage : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e) { } } 将Page类转到定义 发现原来Page类也是继承至IHttpHandler这就是为什么我们可以通过地址http://localhost:16792/TestPage.aspx来访问这个页面的原因。当然子类中的ProcessRequest()方法并没有显示的声明出来因为在Page类里面已经有一个virtue的虚方法如果需要你也可以在TestPage这个类里面显示声明 public partial class TestPage : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e) { } public void ProcessRequest(HttpContext context) { context.Response.Write(你好); } } 然后你会发现这个时候请求会进到ProcessRequest()方法而不会进到Page_Load()里面了至于原因这和Page类里面的封装有关系。当然这不是本文的重点本文要说明的是所有实现了IHttpHandler接口的类型都可以在ProcessRequest()方法里面处理当前http请求。 当然除了ashx和aspx以外还有一类http的服务接口处理文件asmx也和IHttpHandler有着不可分割的联系可以说在asp.net里面只要是处理Http请求的地方IHttpHandler几乎“无处不在”。 2.3、自定义HttpHandler。 当然除了上述asp.net自带的HttpHandler之外我们也可以自定义HttpHandler处理特定的请求。比如我们新建一个TestMyHandler.cs页面 public class TestMyHandler:IHttpHandler{public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { context.Response.Write(从asex页面进来); //throw new NotImplementedException(); } } 当然要使用这个自定义的Handler需要在web.config里面加上配置。PS这部分是博主后来加上的所以直接用正确的配置 system.webServerhandlers add nameasex verb* path*.asex typeMyTestMVC.TestMyHandler, MyTestMVC preConditionintegratedMode / /handlers /system.webServer 这个配置的意思是所有的url以asex结尾的请求都交给TestMyHandler这个类去处理。得到效果 回到顶部 3、MvcHandler解析 上文介绍了那么多IHttpHandler的用法都是在WebForm里面的一些实现我们知道了所有实现了IHttpHandler的类都可以处理Http请求。同样在MVC里面也定义了一个实现IHttpHandler接口的类型——MvcHandler用于处理当前的http请求。通过反编译工具可以看到 public class MvcHandler : IHttpAsyncHandler, IHttpHandler, IRequiresSessionState {// 省略若干字段// 所有方法 static MvcHandler(); public MvcHandler(RequestContext requestContext); protected internal virtual void AddVersionHeader(HttpContextBase httpContext); protected virtual IAsyncResult BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, object state); protected internal virtual IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object state); protected internal virtual void EndProcessRequest(IAsyncResult asyncResult); private static string GetMvcVersionString(); protected virtual void ProcessRequest(HttpContext httpContext); protected internal virtual void ProcessRequest(HttpContextBase httpContext); private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory); private void RemoveOptionalRoutingParameters(); IAsyncResult IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData); void IHttpAsyncHandler.EndProcessRequest(IAsyncResult result); void IHttpHandler.ProcessRequest(HttpContext httpContext); // 省略若干属性 } MvcHandler实现了IHttpHandler、 IHttpAsyncHandler两个接口异步请求这里先不做介绍。重点还是来看看ProcessRequest()方法 将HttpContext转换为HttpContextBase对象继续转到定义。 这里声明了一个IController和IControllerFactory对象通过this.ProcessRequestInit()方法创建具体的Controller实例。我们将ProcessRequestInit()方法转到定义 我们将代码复制出来写入相应的注释      private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory){//1.得到当前的上下文 HttpContext current HttpContext.Current; if (current ! null ValidationUtility.IsValidationEnabled(current) true) ValidationUtility.EnableDynamicValidation(current); this.AddVersionHeader(httpContext); this.RemoveOptionalRoutingParameters(); //2.从路由对象RouteData中获取当前请求的Controller名称 string requiredString this.RequestContext.RouteData.GetRequiredString(controller); //3.得到Controller工厂对象 factory this.ControllerBuilder.GetControllerFactory(); //4.根据当前RequestContext对象从Controller工厂创建具体的Controller对象 controller factory.CreateController(this.RequestContext, requiredString); if (controller null) throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, MvcResources.ControllerBuilder_FactoryReturnedNull, new object[] { factory.GetType(), requiredString })); } 通过上文的注释很好理解整个控制器的实例化过程。本打算看下Controller工厂如何创建以及控制器如何实例化的奈何这部分反编译不了。我们暂且理解为反射吧这些实现细节并不影响我们理解整个过程。 创建控制器成功之后就是执行Action方法了这个过程在上面反编译的第二张图片的 controller.Execute(this.RequestContext); 方法得到体现。所以除去细节理解MvcHandler的ProcessRequest()方法并不是太难。 回到顶部 三、HttpModule 除了HttpHandler之外Asp.net里面还有另外一个重要的角色——HttpModule。和HttpHandler类似HttpModule指所有实现了IHttpModule接口的一类类型的统称。至于HttpModule、IHttpModule、UrlRoutingModule各个名称的含义和上述HttpHandler相同在此不做重复说明。 回到顶部 1、HttpModule能干什么 通过上文我们知道HttpHandler的作用非常明确处理Http请求生成相应结果。那么HttpModule又是干什么的呢 HttpHandler的作用是处理某一类别的请求比如ashx、aspx、asmx等在某些情况下各类请求可能都需要进行某些相同的处理比如请求拦截、身份认证、检查功能等不可能在每个类别的HttpHandler里面都去实现这些相同的代码这个时候怎么办呢处理某一类通用请求提高代码的复用率。是不是想到了我们的面向切面编程AOP没错HttpModule就是负责做这个事HttpModule通过事件订阅的方式将某类HttpHandler都需要的功能抽取出来这些功能可以编译成类库供各个模块调用。这种采用事件观察者的设计模式使得系统设计上更加灵活。 回到顶部 2、HttpModule的使用 先来看看IHttpModule的定义 public interface IHttpModule {//初始化void Init(HttpApplication context); //释放 void Dispose(); } 接口定义很简单一个初始化组件的方法一个释放对象的方法。 我们来写一个测试的例子具体看看HttpModule如何注册事件我们新建一个IHttpModule的实现类 namespace MyTestMVC {public class TestMyModule:IHttpModule{public void Dispose() { //throw new NotImplementedException(); } public void Init(HttpApplication app) { //事件注册 app.BeginRequest app_BeginRequest; app.EndRequest app_EndRequest; } void app_EndRequest(object sender, EventArgs e) { var app (HttpApplication)sender; app.Context.Response.Write(请求结束); } void app_BeginRequest(object sender, EventArgs e) { var app (HttpApplication)sender; app.Context.Response.Write(请求开始); } } } 在Init方法里面通过HttpApplication对象来注册请求的事件。这样每次发起一次http请求的时候都进到这两个方法。 当然这些注册就能执行了吗想得美系统哪里知道你这个自定义HttpModule的存在所以必须要在Web.config里面声明一下。 system.webhttpModules add nameTestMyModule typeMyTestMVC.TestMyModule, MyTestMVC / /httpModules /system.web 出现结果 查阅资料后发现原来IIS经典模式下必须要这样配置 system.webServermodules add nameTestMyModule typeMyTestMVC.TestMyModule, MyTestMVC preConditionintegratedMode / /modules /system.webServer 没办法用微软的东西就要遵守别人的游戏规则。改成这样之后得到结果 文中的“你好”来自这里  既然HttpModule是事件注册机制的那么如果需要在同一个事件里面去实现不同的功能也就是说同一个事件注册多次是否可行呢我们来试一把 假如TestMyModule.cs这个自定义Module的作用是功能检查 public class TestMyModule:IHttpModule{public void Dispose() { //throw new NotImplementedException(); } public void Init(HttpApplication app) { //事件注册 app.BeginRequest app_BeginRequest; app.EndRequest app_EndRequest; } void app_EndRequest(object sender, EventArgs e) { var app (HttpApplication)sender; app.Context.Response.Write(功能检查结束); } void app_BeginRequest(object sender, EventArgs e) { var app (HttpApplication)sender; app.Context.Response.Write(功能检查开始); //功能检查的处理逻辑... } } 然后新建一个TestMyModule2.cs这个自定义Module去实现请求拦截的功能 public class TestMyModule2:IHttpModule{public void Dispose() { //throw new NotImplementedException(); } public void Init(HttpApplication app) { //事件注册 app.BeginRequest app_BeginRequest; app.EndRequest app_EndRequest; } void app_EndRequest(object sender, EventArgs e) { var app (HttpApplication)sender; app.Context.Response.Write(请求拦截结束); } void app_BeginRequest(object sender, EventArgs e) { var app (HttpApplication)sender; app.Context.Response.Write(请求拦截开始); //请求拦截的处理逻辑.... } } 最后在Web.config里面配置两个Module system.webServermodules add nameTestMyModule typeMyTestMVC.TestMyModule, MyTestMVC preConditionintegratedMode / add nameTestMyModule2 typeMyTestMVC.TestMyModule2, MyTestMVC preConditionintegratedMode / /modules /system.webServer 得到结果   这说明同一个事件可以注册多次即可以在同一个事件里面做不同的事。 回到顶部 3、HttpModule和HttpHandler如何区分 通过上文的HttpModule的应用我们看到在Init方法里面可以拿到当前应用的HttpApplication对象拿到这个貌似就可以拿到当前请求上下文里面的Request、Response了是不是就可以处理当前的http请求了从这点上来说HttpModule也能处理http请求或者说具有处理http请求的能力。既然HttpHandler和HttpModule都可以处理http请求那在使用的时候如何区分呢上文说过HttpModule的作用类似AOP是针对某些通用功能请求拦截、身份认证、检查功能的而HttpHandler常用来处理某一类ashx、aspx、asmxhttp请求两者的侧重点不同至于具体在实际中如何使用你可以自行考量。 回到顶部 4、UrlRoutingModule解析 好了上面介绍那么多HttpModule的使用都是在为了解Mvc里面的UrlRoutingModule做铺垫。上文说过UrlRoutingModule的作用是拦截请求那么它是如何做的呢还是来反编译看看吧。 public class UrlRoutingModule : IHttpModule {// Fieldsprivate static readonly object _contextKey; private static readonly object _requestDataKey; private RouteCollection _routeCollection; // Methods static UrlRoutingModule(); public UrlRoutingModule(); protected virtual void Dispose(); protected virtual void Init(HttpApplication application); private void OnApplicationPostResolveRequestCache(object sender, EventArgs e); [Obsolete(This method is obsolete. Override the Init method to use the PostMapRequestHandler event.)] public virtual void PostMapRequestHandler(HttpContextBase context); public virtual void PostResolveRequestCache(HttpContextBase context); void IHttpModule.Dispose(); void IHttpModule.Init(HttpApplication application); // Properties public RouteCollection RouteCollection { get; set; } } 重点肯定在Init()方法。 图一 注册HttpApplication对象的PostResolveRequestCache事件。 图二 封装HttpContext成为HttpContextWrapper对象 图三 这部分代码是我们上述路由理论的代码实践所以这段代码很重要我们将代码拷贝出来      public virtual void PostResolveRequestCache(HttpContextBase context){//1.传入当前上下文对象得到与当前请求匹配的RouteData对象 RouteData routeData this.RouteCollection.GetRouteData(context); if (routeData ! null) { //2.从RouteData对象里面得到当前的RouteHandler对象。其实这里的RouteHandler属性对应就是一个MvcRouteHandler的对象。 IRouteHandler routeHandler routeData.RouteHandler; if (routeHandler null) throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, SR.GetString(UrlRoutingModule_NoRouteHandler), new object[0])); if (!(routeHandler is StopRoutingHandler)) { //3.根据HttpContext和RouteData得到RequestContext对象 RequestContext requestContext new RequestContext(context, routeData); context.Request.RequestContext requestContext; //4.根据RequestContext对象得到处理当前请求的HttpHandlerMvcHandler。 IHttpHandler httpHandler routeHandler.GetHttpHandler(requestContext); if (httpHandler null) { object[] args new object[] { routeHandler.GetType() }; throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture, SR.GetString(UrlRoutingModule_NoHttpHandler), args)); } if (httpHandler is UrlAuthFailureHandler) { if (!FormsAuthenticationModule.FormsAuthRequired) throw new HttpException(0x191, SR.GetString(Assess_Denied_Description3)); UrlAuthorizationModule.ReportUrlAuthorizationFailure(HttpContext.Current, this); } else //5.请求转到HttpHandler进行处理进入到ProcessRequest方法。这一步很重要由这一步开始请求才由UrlRoutingModule转到了MvcHandler里面 context.RemapHandler(httpHandler); } } } 博主在主要的地方加上了注释。 代码释疑这里有几点需要说明的。 1、HttpApplication对象的PostResolveRequestCache事件在MSDN上的解释是在 ASP.NET 跳过当前事件处理程序的执行并允许缓存模块满足来自缓存的请求时发生。查阅相关资料发现之所以在PostResolveRequestCache事件注册路由、匹配HttpHandler是为了满足IIS6。可以参考Tom大叔的文章http://www.cnblogs.com/TomXu/p/3756858.html。 2、 IRouteHandler routeHandler routeData.RouteHandler; 这里的routeHandler实际上是一个MvcRouteHandler类型的对象为什么这么说我们来反编译下这个就会一目了然 图一   MvcRouteHandler实现了IRouteHandler接口。然后我们重点来看GetHttpHandler()方法得到的是哪个HttpHandler。 图二   看到最后一句是不是立马就明白了。也就是说GetHttpHandler()这个方法决定了采用MvcHandler去处理当前的http请求。所以在上述 IHttpHandler httpHandler routeHandler.GetHttpHandler(requestContext); 这一句得到的就是一个MvcHandler的实例。 3、 context.RemapHandler(httpHandler); 这一句可以理解为将当前的请求上下文交给httpHandler这个对象去处理。 4、到这里我们再反过来看前面的MVC的原理就完全明朗了。 请求被UrlRoutingModule部件拦截————通过注册HttpApplication对象的PostResolveRequestCache事件来实现拦截封装请求上下文HttpContext成为HttpContextWrapper对象。————将UrlRoutingModule的Init()方法转到定义可以看到这么一句 HttpContextBase context new HttpContextWrapper(((HttpApplication) sender).Context); 根据当前的HttpContext从Routes集合中得到与当前请求URL相符合的RouteData对象。————将UrlRoutingModule的Init()方法转到定义最终会找到PostResolveRequestCache()方法方法里面有一句 RouteData routeData this.RouteCollection.GetRouteData(context); 将RouteData与HttpContext请求封装成一个RequestContext对象。————同样在上述方法里面 RequestContext requestContext new RequestContext(context, routeData); 根据RequestContext对象从RouteData的RouteHandler中获取IHttpHandlerMVC里面会有一个IHttpHandler的实现类MvcHandler。————同样在该方法里面 IHttpHandler httpHandler routeHandler.GetHttpHandler(requestContext); 执行IHttpHandlerMvcHandler。———— context.RemapHandler(httpHandler); 将请求交给MvcHandler处理。然后就是通过反射激活具体的controller执行具体的action。————在MvcHandler的ProcessRequest()方法里面的执行逻辑回到顶部  四、总结 写到这里总算把整个过程梳理了一遍很多细节都未涉及但是大的过程应该还是明朗的。通篇比较偏理论所以整体上比较枯燥但是还是希望园友们能够静下心来慢慢看因为博主觉得这些对于理解MVC原理太重要想想看如果你也完全理解了这个过程是不是都可以自己通过实现IHttphandler和IHttpModule去搭建一个简单的MVC框架了不错博主确实是这样打算的这篇把理论搞清楚下篇就是实现的细节了。其实写自己的MVC框架更多的在于学习MVC原理希望自己能够坚持下去。如果你觉得本文能够帮助你可以右边随意 打赏 博主也可以 推荐 进行精神鼓励。你的支持是博主继续坚持的不懈动力。 本文原创出处http://www.cnblogs.com/landeanfen/ 欢迎各位转载但是未经作者本人同意转载文章之后必须在文章页面明显位置给出作者和原文连接否则保留追究法律责任的权利 源码下载 密码juw2 转载于:https://www.cnblogs.com/yxhblog/p/7498709.html
http://www.zqtcl.cn/news/570115/

相关文章:

  • 详细描述建设网站wordpress 子页面
  • 做公司网站推广如何快速推广
  • 给期货交易类做网站违法吗青海企业网站制作
  • 成都网站模板购买一站式营销型网站建设服务
  • wordpress建站优势做网站认证对网站有什么好处
  • synology做网站专业企业建站价格
  • php开发大型网站开发免费个人微网站
  • 专门做奢侈品的网站怎么建设课题网站
  • 博客推广那个网站列好深圳社保个人网页登录
  • 网站的背景图怎么做最新章节 第一百四十七章 做视频网站
  • 济南网站建设百家号阿里云怎么wordpress
  • 网站分享对联广告北京建设执业网站
  • 一级做爰片免费网站域名流量查询
  • 做网站网站需要注意什么网站建设swot市场分析
  • 大学生兼职网站的融资方案云凡济南网站建设开发
  • 做动态效果的插件网站抚顺清原网站建设招聘
  • 商务网站开发需求分析厦门35网站建设公司
  • wordpress classseo推广服务
  • 石景山网站建设公司网站后台密码如何破解
  • 哪个大学的网站做的最好看南宁网站设计制作公司
  • 北京 集团公司网站建设免费网站建设模版云盘
  • 阿里云建设网站要什么广州网站建设方案案例
  • 德阳吧网站建设线上编程培训机构哪家好
  • 天津电商网站开发备案查询站长之家
  • 网至普的营销型网站布局青岛做网站
  • 网站开发的安全问题wordpress文章列表显示缩略图
  • 网站运营招聘代理商加盟
  • 清远 网站建设自己做的网站怎么发布
  • 可以做免费推广的网站短视频app有哪些
  • 班级网站建设的系统概述wordpress品牌分类