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

深圳网站系统哪家强wordpress chuxin

深圳网站系统哪家强,wordpress chuxin,武隆网站建设费用,安阳网络教研平台前面三节讲了控件的构造、呈现和数据绑定#xff0c;我想该差不多了。本想讲一个自定义控件来终结控件部分#xff0c;但是我个人不太喜欢控件这些东西#xff0c;所以也就懒的写相关的内容#xff0c;抱歉了。虽然我不喜欢使用控件#xff0c;但我还是喜欢整个WebForm的设…    前面三节讲了控件的构造、呈现和数据绑定我想该差不多了。本想讲一个自定义控件来终结控件部分但是我个人不太喜欢控件这些东西所以也就懒的写相关的内容抱歉了。虽然我不喜欢使用控件但我还是喜欢整个WebForm的设计。一个字“太神了”。前面章节将Page生命周期的时候有朋友评论说内容太少了今天开始就从来围绕生命周期的话讲讲相关的内容吧。     IHttpModule是个什么东西呢对我们Web开发有什么用呢     先从名字来看他是一个接口接口就是让人来继承的我们要用它就得继承他并实现他的方法。Module的意思是模块、组件的意思。如果说我们实现了这个接口并配置了web.config让IIS的知道我们的web程序使用了这个组件那么我们的程序是不是就比默认的web程序多了个组件显然而且在必要的时候会调用我们组件里定义的方法这就是HttpModule的用处。说白了就是我们给IIS写扩展但该扩展仅仅是针对于使用了(配置config)的web程序。其实每个web应用程序都是一个IIS进程而这个进程的配置文件就是web.config。     弄明白了他的意义我们就开始我们创建一个Web应用程序并创建一个类继承IHttpModule并实现他的方法在Config的Modules节点里add name type/OK namespace WebApplication1 { public class MyHttpModule : IHttpModule { public void Dispose() { }public void Init(HttpApplication context) { context.Context.Response.Write(1); } } }?xml version1.0? configuration system.web compilation debugtrue targetFramework4.0 / httpModules add nameMyHttpModule typeWebApplication1.MyHttpModule,WebApplication1/ /httpModules /system.websystem.webServer modules runAllManagedModulesForAllRequeststrue add nameMyHttpModule typeWebApplication1.MyHttpModule,WebApplication1/!--注意type类的FullName,类所在的dll名-- /modules /system.webServer /configuration web.config的配置有2个上面的那个是给非IIS7用的下面的显然就是给IIS7用的。启动程序what happend?! 是不是页的头部多了个1有木有我们打开任何页面都会有个1说明我们的模块起到作用了也说明每个请求都会执行HttpModule的Init方法是不是呢 我们把代码改一下:   public void Init(HttpApplication context) { context.Context.Response.Write(1); context.BeginRequest OnBeginRequest; }public void OnBeginRequest(object sender, EventArgs e) { var app (HttpApplication)sender; var url app.Context.Request.RawUrl; app.Context.Response.Write(url); }分别给Init和OnBeginRequest 两个方法加断点重新编译下然后F5看看。Init只走1次而OnBeginRequest却走了3次ur的值l分别是  default.aspx   style.css 和 favorite.ico可以看出任何url请求包括静态文件都会经过执行我们定义的事件方法看来这要比只处理aspx慢不少 Init的必须走一次啊要不然事件不被订阅3次了但为什么只走1次呢这到底是为什么呢 呵呵其实很简单MyHttpModule就实例化一次哦实例化后执行Init初始化然后就驻留在应用程序池了直到应用程序池被回收或他被各种原因搞崩溃而OnBeginRequest是被HttpApplication类的BeginRequest事件订阅的。事件订阅是个什么概念事件是个特殊的委托委托是个什么概念委托是个方法指针。所以只要委托被执行就会执行他指向的方法体也就是OnBeginRequest可见OnBeginRequest的执行是和HttpApplication的BeginRequest有关系的和MyHttpModule本身已经没关系了。     走了3次说明3个Request都执行了BeginRequest难道每个请求都实例化一个HttpApplication从名字我就能看出不会的因为Application(应用程序)嘛我们目前运行的就一个怎么会不断的实例化想刨根问题彻底整明白就得翻出Framework的源码调试 ------------声明下面的源码可以不用完全理解也可以跳过只要知道跟Request有关就行了------------ 下面来调查下HttpApplication的初始化过程 用Reflector查阅System.Web名字空间下的类可以看到HttpApplicationFactory类他负责HttpApplication的创建。当我们启动站点后第一次的时候比较慢为什么呢 因为初始化的构建工作。 System.Web.Complilation名字空间下有一堆的构建类其中就有构建Global.asax的也就是我们的HttpApplication类然后缓存到Factory的堆栈里我们需要的时候pop出来。 你可能有疑问pop了不就没了吗 其实app在执行的时候还会push回去详见HttpApplication.ReleaseAppInstance方法 HttpApplicationFactory有个GetApplicationInstance方法就是用来获取HttpApplication的  internal static IHttpHandler GetApplicationInstance(HttpContext context) { if (_customApplication ! null) { return _customApplication; } if (context.Request.IsDebuggingRequest) { return new HttpDebugHandler(); } _theApplicationFactory.EnsureInited(); _theApplicationFactory.EnsureAppStartCalled(context); return _theApplicationFactory.GetNormalApplicationInstance(context); }private HttpApplication GetNormalApplicationInstance(HttpContext context) { HttpApplication application null; lock (this._freeList) { if (this._numFreeAppInstances 0) { application (HttpApplication) this._freeList.Pop();//如果_freeList里有就直接获取只有第一次构建的时候没有 this._numFreeAppInstances--; if (this._numFreeAppInstances this._minFreeAppInstances) { this._minFreeAppInstances this._numFreeAppInstances; } } } if (application null) { application (HttpApplication) HttpRuntime.CreateNonPublicInstance(this._theApplicationType); using (new ApplicationImpersonationContext()) { application.InitInternal(context, this._state, this._eventHandlerMethods);//这里是初始化application的并且会经过复杂的一坨代码后push到_freeList里 } } return application; } 跟踪这个方法我们可以断定Application是被缓存起来的不是每次都是实例化的。 通过Reflector的分析我们能发现这个GetApplicationInstance方法是被HttpRuntime.ProcessRequestNow调用的终于回到我们的Request来了。 private void ProcessRequestNow(HttpWorkerRequest wr) { HttpContext context; try { context new HttpContext(wr, false);//实例化上下文 } catch { wr.SendStatus(400, Bad Request); wr.SendKnownResponseHeader(12, text/html; charsetutf-8); byte[] bytes Encoding.ASCII.GetBytes(htmlbodyBad Request/body/html); wr.SendResponseFromMemory(bytes, bytes.Length); wr.FlushResponse(true); wr.EndOfRequest(); return; } wr.SetEndOfSendNotification(this._asyncEndOfSendCallback, context); Interlocked.Increment(ref this._activeRequestCount); HostingEnvironment.IncrementBusyCount(); try { try { this.EnsureFirstRequestInit(context); } catch { if (!context.Request.IsDebuggingRequest) { throw; } } context.Response.InitResponseWriter();//实例化HttpWriter输出用的我们的控件输出全靠他 IHttpHandler applicationInstance HttpApplicationFactory.GetApplicationInstance(context);//获取handler也就是httpapplication if (applicationInstance null) { throw new HttpException(SR.GetString(Unable_create_app_object)); } if (EtwTrace.IsTraceEnabled(5, 1)) { EtwTrace.Trace(EtwTraceType.ETW_TYPE_START_HANDLER, context.WorkerRequest, applicationInstance.GetType().FullName, Start); } if (applicationInstance is IHttpAsyncHandler)//是否异步的显然我们的HttpApplication是继承这个接口的所以走这个if { IHttpAsyncHandler handler2 (IHttpAsyncHandler) applicationInstance; context.AsyncAppHandler handler2; handler2.BeginProcessRequest(context, this._handlerCompletionCallback, context);//从BeginRequest就开始执行application的step } else { applicationInstance.ProcessRequest(context);//直接执行 this.FinishRequest(context.WorkerRequest, context, null); } } catch (Exception exception) { context.Response.InitResponseWriter(); this.FinishRequest(wr, context, exception); } } 很好上面的代码让我们看清了一个Request的执行过程。而每个Request都会走这个方法HttpRuntime有个RequestQueue请求队列会依次执行所有的Request。终于知道为什么走3次了吧 就是application被用了3次。感兴趣的同学可以再去跟踪RequestQueue我就不贴了。 另外HttpApplication意味着他是整个站点的boss我们定义的myhttpmodule不过是他众多Modules里的其中之一。而且我们也可以定义多个moduleconfig里面add多个就可以了。 在Application初始化的过程中有初始化module的一段我贴出来大家看看 private void InitModules() { this._moduleCollection RuntimeConfig.GetAppConfig().HttpModules.CreateModules(); this.InitModulesCommon(); } 其中CreateModules就是从web.config的module节点实例化我们配置的module internal HttpModuleCollection CreateModules() { HttpModuleCollection modules new HttpModuleCollection(); foreach (HttpModuleAction action in this.Modules) { modules.AddModule(action.Entry.ModuleName, action.Entry.Create()); } modules.AddModule(DefaultAuthentication, new DefaultAuthenticationModule()); return modules; } 最后初始化所有的module包括系统的一些module。 private void InitModulesCommon() { int count this._moduleCollection.Count; for (int i 0; i count; i) { this._currentModuleCollectionKey this._moduleCollection.GetKey(i); this._moduleCollection[i].Init(this);//初始化每个HttpModule } this._currentModuleCollectionKey null; this.InitAppLevelCulture(); } --------------跳到这里----------------     HttpApplication类公开了很多事件。上面的示例程序用到了BeginRequest这个事件是最先开始执行的事件其作用很明白就是Request开始执行时我们要准备点什么或许你可能需要urlrewriter。下面插播“事件广告”广告之后马上飞来。 上面我只是简单的提了一句“事件是特殊的委托”并没有详细说为什么特殊。不知道同学你是否理解事件的意义呢事件的意义是什么 我是这么理解的。“事件”代表着一件事情的发生。我们打一个比方我把每天的生活设计成一个类。那么一天的生活包含什么包含从早到晚包含很多事情要去做甚至包含一些固定的事情。 细品这3个包含 从早到晚意味着这是一个过程从头到尾从始到终很多事情要去做说明在这个过程中要执行很多事而一些固定的事情比如吃饭睡觉。 我们可以把早和晚看作是构造函数和析构函数把很多事情要做看作是事件把固定的事情看作是方法。 因为每个人一天的生活都不一定是相同的所以每天要去做的事我们没法写成方法我们最多只能定义一些固有的模式的方法抽象比如起床后做什么午饭后做什么睡觉前做什么。这不就是事件么 我们在设计类到时候如果类的使用有时候也涉及到一些执行过程的问题而在这个过程中会发生一些未知的事情未知意味着由外部类来提供自己提供就是已知了我们便把这些未知设计成抽象的方法。 由于过程的顺序是固定的比如午饭后做什么就必须实在午饭后所以午饭后做什么事件不能被别人在早上使用你就是上帝不能把午饭的事情给我挪到早饭挪了就叫早饭后了。 同样的道理事件的执行不能由外部来决定这就是事件有别于委托的地方委托没有使用限制随时随地都可以用这也是事件的意义。 整个过程也就是所谓的“生命周期”。 代码和现实就是这么的一致耐人寻味。 广告回来~~ 继续看HttpApplication的事件我把他们按执行的顺序贴了出来从名字就能看出大概的作用。有些我从来没用过 BeginRequest        //请求开始 AuthenticateRequest    PostAuthenticateRequest    AuthorizeRequest        PostAuthorizeRequest ResolveRequestCache    PostResolveRequestCache PostMapRequestHandler AcquireRequestState    //获得请求状态这时候已经有session了 PostAcquireRequestState PreRequestHandlerExecute    //准备交给HttpHandler处理 Error            //请求出现了异常 PostRequestHandlerExecute ReleaseRequestState    //发布请求的状态 PostReleaseRequestState UpdateRequestCache PostUpdateRequestCache EndRequest        //结束请求 PreSendRequestHeaders    //准备发送请求头信息在这我们还能修改内容 PreSendRequestContent    //准备发送请求内容这里就改不了了 这才是真正的整个生命周期是不是而面试题一般考的是Page类的生命周期这已经过时了web开发又不光Webform所以考page类没技术含量 在HttpApplication里把这些事件作为StepStep by Step的执行下去下面是HttpApplication构建Step的代码 internal override void BuildSteps(WaitCallback stepCallback) { ArrayList steps new ArrayList(); HttpApplication app base._application; bool flag false; UrlMappingsSection urlMappings RuntimeConfig.GetConfig().UrlMappings; flag urlMappings.IsEnabled (urlMappings.UrlMappings.Count 0); steps.Add(new HttpApplication.ValidatePathExecutionStep(app)); if (flag) { steps.Add(new HttpApplication.UrlMappingsExecutionStep(app)); } app.CreateEventExecutionSteps(HttpApplication.EventBeginRequest, steps); app.CreateEventExecutionSteps(HttpApplication.EventAuthenticateRequest, steps); app.CreateEventExecutionSteps(HttpApplication.EventDefaultAuthentication, steps); app.CreateEventExecutionSteps(HttpApplication.EventPostAuthenticateRequest, steps); app.CreateEventExecutionSteps(HttpApplication.EventAuthorizeRequest, steps); app.CreateEventExecutionSteps(HttpApplication.EventPostAuthorizeRequest, steps); app.CreateEventExecutionSteps(HttpApplication.EventResolveRequestCache, steps); app.CreateEventExecutionSteps(HttpApplication.EventPostResolveRequestCache, steps); steps.Add(new HttpApplication.MapHandlerExecutionStep(app)); app.CreateEventExecutionSteps(HttpApplication.EventPostMapRequestHandler, steps); app.CreateEventExecutionSteps(HttpApplication.EventAcquireRequestState, steps); app.CreateEventExecutionSteps(HttpApplication.EventPostAcquireRequestState, steps); app.CreateEventExecutionSteps(HttpApplication.EventPreRequestHandlerExecute, steps); steps.Add(new HttpApplication.CallHandlerExecutionStep(app)); app.CreateEventExecutionSteps(HttpApplication.EventPostRequestHandlerExecute, steps); app.CreateEventExecutionSteps(HttpApplication.EventReleaseRequestState, steps); app.CreateEventExecutionSteps(HttpApplication.EventPostReleaseRequestState, steps); steps.Add(new HttpApplication.CallFilterExecutionStep(app)); app.CreateEventExecutionSteps(HttpApplication.EventUpdateRequestCache, steps); app.CreateEventExecutionSteps(HttpApplication.EventPostUpdateRequestCache, steps); this._endRequestStepIndex steps.Count; app.CreateEventExecutionSteps(HttpApplication.EventEndRequest, steps); steps.Add(new HttpApplication.NoopExecutionStep()); this._execSteps new HttpApplication.IExecutionStep[steps.Count]; steps.CopyTo(this._execSteps); this._resumeStepsWaitCallback stepCallback; } 从构建的顺序我们也能看出执行的顺序每个Step都有一个Execute的方法挨个执行下去如果程序出现异常则直接跳出。而我们的Page执行是在CallHandlerExecutionStep这个Step里。     好啦就讲到这呗今天汉字比较少代码比较多您还有啥不能明白的就评论里聊吧。没用过的同学动写个吧HttpModule是个好东西哦。PS我们公司面试的笔试题里有道题“给一个正在运行的网站增加一个异常监控功能该怎么实现” 你能想到怎么做吗转载于:https://www.cnblogs.com/mad/archive/2011/04/11/asp-net-httpmodule-and-httpapplication.html
http://www.zqtcl.cn/news/709891/

相关文章:

  • 膜结构网站推广怎么做怎样把网站上传到空间
  • 三维网站是怎么做的商城网站 运营
  • 程序员网站开发框架无锡网络公司网站建设app微信公众号平
  • 中关村网站建设网络营销策划书范文
  • 电商网站建设与课程设计科技网站模版
  • 建设部网站资质漳州最专业的网站建设公司
  • 网站建设需求和页面需求怎么提一个静态网站怎么做
  • 宝塔wordpress广州网站营销seo
  • 甘肃城乡建设厅网站首页发布公司信息的网站
  • 工信部网站备案查询 手机凡科网微信小程序制作
  • 一站多通怎么做网站网站推广工具 刷链接
  • 学生做网站的工作室网络舆情监测与研判考试重点
  • 做网站去哪个公司好广告创意设计论文
  • 20m带宽做网站够用吗win7创建wordpress
  • qq音乐怎么做mp3下载网站发卡网站建设方案
  • 做cpc不做网站可以吗网站跳出率
  • 公司网站变更域名有了域名就可以做网站了吗
  • 网站建设推广营销策划做外贸网站需要注册公司吗
  • 可信赖的赣州网站建设做羽毛球网站
  • 如何找网站做推广wordpress登录及注册
  • 韩国美容网站 模板wordpress中英文
  • 为什么邮箱突然进不去了总提示正在进入不安全网站wordpress需注册访问
  • 建网站哪家最好山东泰安房价
  • wordpress4.9+多站点网络推广公司联系昔年下拉
  • 西安seo网站关键词优化罗田县建设局网站
  • 北京网站建设 shwllnmp新手 wordpress
  • 优化网站结构一般包括如何进行网络营销风险控制
  • 怎样查看网站是用什么做的郫都区规划建设局网站
  • 新乡营销型网站建设制作网站设计的总结
  • 做网站的免费空间微信crm管理系统