mvc5 源码解析2-2 mvchandler的执行
我们从application获取的时候查看stepmanager的实现类
IHttpHandler applicationInstance = HttpApplicationFactory.GetApplicationInstance(httpContext);
/ System.Web.HttpApplicationFactory
internal static IHttpHandler GetApplicationInstance(HttpContext context)
{
if (HttpApplicationFactory._customApplication != null)
{
return HttpApplicationFactory._customApplication;
}
if (context.Request.IsDebuggingRequest)
{
return new HttpDebugHandler();
}
HttpApplicationFactory._theApplicationFactory.EnsureInited();
HttpApplicationFactory._theApplicationFactory.EnsureAppStartCalled(context);
return HttpApplicationFactory._theApplicationFactory.GetNormalApplicationInstance(context);
}
/ System.Web.HttpApplicationFactory
private HttpApplication GetNormalApplicationInstance(HttpContext context)
{
HttpApplication httpApplication = null;
if (!this._freeList.TryTake(out httpApplication))
{
//创建application
httpApplication = (HttpApplication)HttpRuntime.CreateNonPublicInstance(this._theApplicationType);
using (new ApplicationImpersonationContext())
{
//初始化application
httpApplication.InitInternal(context, this._state, this._eventHandlerMethods);
}
}
if (AppSettings.UseTaskFriendlySynchronizationContext)
{
httpApplication.ApplicationInstanceConsumersCounter = new CountdownTask();
Task arg_8A_0 = httpApplication.ApplicationInstanceConsumersCounter.Task;
Action<Task, object> arg_8A_1;
if ((arg_8A_1 = HttpApplicationFactory.<>c.<>9__34_0) == null)
{
arg_8A_1 = (HttpApplicationFactory.<>c.<>9__34_0 = new Action<Task, object>(HttpApplicationFactory.<>c.<>.<GetNormalApplicationInstance>b__34_0));
}
arg_8A_0.ContinueWith(arg_8A_1, httpApplication, TaskContinuationOptions.ExecuteSynchronously);
}
return httpApplication;
}
初始化application
// System.Web.HttpApplication
internal void InitInternal(HttpContext context, HttpApplicationState state, MethodInfo[] handlers)
{
this._state = state;
PerfCounters.IncrementCounter(AppPerfCounter.PIPELINES);
try
{
try
{
this._initContext = context;
this._initContext.ApplicationInstance = this;
context.ConfigurationPath = context.Request.ApplicationPathObject;
using (new DisposableHttpContextWrapper(context))
{
if (HttpRuntime.UseIntegratedPipeline)
{
try
{
context.HideRequestResponse = true;
this._hideRequestResponse = true;
this.InitIntegratedModules();
goto IL_6B;
}
finally
{
context.HideRequestResponse = false;
this._hideRequestResponse = false;
}
}
this.InitModules();
IL_6B:
if (handlers != null)
{
this.HookupEventHandlersForApplicationAndModules(handlers);
}
this._context = context;
if (HttpRuntime.UseIntegratedPipeline && this._context != null)
{
this._context.HideRequestResponse = true;
}
this._hideRequestResponse = true;
try
{
this.Init();
}
catch (Exception error)
{
this.RecordError(error);
}
}
if (HttpRuntime.UseIntegratedPipeline && this._context != null)
{
this._context.HideRequestResponse = false;
}
this._hideRequestResponse = false;
this._context = null;
this._resumeStepsWaitCallback = new WaitCallback(this.ResumeStepsWaitCallback);
//判断是集成模式还是经典模式分别初始化不同的stepmanager
if (HttpRuntime.UseIntegratedPipeline)
{
this._stepManager = new HttpApplication.PipelineStepManager(this);
}
else
{
this._stepManager = new HttpApplication.ApplicationStepManager(this);
}
//创建步骤
this._stepManager.BuildSteps(this._resumeStepsWaitCallback);
}
finally
{
this._initInternalCompleted = true;
context.ConfigurationPath = null;
this._initContext.ApplicationInstance = null;
this._initContext = null;
}
}
catch
{
throw;
}
}
创建步骤及执行步骤
经典模式PipelineStepManager管道创建步骤
internal override void BuildSteps(WaitCallback stepCallback)
{
//加入步骤各个事件
ArrayList arrayList = new ArrayList();
HttpApplication application = this._application;
UrlMappingsSection urlMappings = RuntimeConfig.GetConfig().UrlMappings;
bool flag = urlMappings.IsEnabled && urlMappings.UrlMappings.Count > ;
arrayList.Add(new HttpApplication.ValidateRequestExecutionStep(application));
arrayList.Add(new HttpApplication.ValidatePathExecutionStep(application));
if (flag)
{
arrayList.Add(new HttpApplication.UrlMappingsExecutionStep(application));
}
application.CreateEventExecutionSteps(HttpApplication.EventBeginRequest, arrayList);
application.CreateEventExecutionSteps(HttpApplication.EventAuthenticateRequest, arrayList);
application.CreateEventExecutionSteps(HttpApplication.EventDefaultAuthentication, arrayList);
application.CreateEventExecutionSteps(HttpApplication.EventPostAuthenticateRequest, arrayList);
application.CreateEventExecutionSteps(HttpApplication.EventAuthorizeRequest, arrayList);
application.CreateEventExecutionSteps(HttpApplication.EventPostAuthorizeRequest, arrayList);
application.CreateEventExecutionSteps(HttpApplication.EventResolveRequestCache, arrayList);
application.CreateEventExecutionSteps(HttpApplication.EventPostResolveRequestCache, arrayList);
arrayList.Add(new HttpApplication.MapHandlerExecutionStep(application));
application.CreateEventExecutionSteps(HttpApplication.EventPostMapRequestHandler, arrayList);
application.CreateEventExecutionSteps(HttpApplication.EventAcquireRequestState, arrayList);
application.CreateEventExecutionSteps(HttpApplication.EventPostAcquireRequestState, arrayList);
application.CreateEventExecutionSteps(HttpApplication.EventPreRequestHandlerExecute, arrayList);
arrayList.Add(application.CreateImplicitAsyncPreloadExecutionStep());
//加入mvchandler执行的步骤事件
arrayList.Add(new HttpApplication.CallHandlerExecutionStep(application));
application.CreateEventExecutionSteps(HttpApplication.EventPostRequestHandlerExecute, arrayList);
application.CreateEventExecutionSteps(HttpApplication.EventReleaseRequestState, arrayList);
application.CreateEventExecutionSteps(HttpApplication.EventPostReleaseRequestState, arrayList);
arrayList.Add(new HttpApplication.CallFilterExecutionStep(application));
application.CreateEventExecutionSteps(HttpApplication.EventUpdateRequestCache, arrayList);
application.CreateEventExecutionSteps(HttpApplication.EventPostUpdateRequestCache, arrayList);
this._endRequestStepIndex = arrayList.Count;
application.CreateEventExecutionSteps(HttpApplication.EventEndRequest, arrayList);
arrayList.Add(new HttpApplication.NoopExecutionStep());
this._execSteps = new HttpApplication.IExecutionStep[arrayList.Count];
arrayList.CopyTo(this._execSteps);
this._resumeStepsWaitCallback = stepCallback;
}
CallHandlerExecutionStep
void HttpApplication.IExecutionStep.Execute()
{
HttpContext context = this._application.Context;
IHttpHandler handler = context.Handler;
if (EtwTrace.IsTraceEnabled(4, 4))
{
EtwTrace.Trace(EtwTraceType.ETW_TYPE_HTTPHANDLER_ENTER, context.WorkerRequest);
}
if (handler != null && HttpRuntime.UseIntegratedPipeline)
{
IIS7WorkerRequest iIS7WorkerRequest = context.WorkerRequest as IIS7WorkerRequest;
if (iIS7WorkerRequest != null && iIS7WorkerRequest.IsHandlerExecutionDenied())
{
this._sync = true;
HttpException ex = new HttpException(403, SR.GetString("Handler_access_denied"));
ex.SetFormatter(new PageForbiddenErrorFormatter(context.Request.Path, SR.GetString("Handler_access_denied")));
throw ex;
}
}
if (handler == null)
{
this._sync = true;
return;
}
if (handler is IHttpAsyncHandler)
{
IHttpAsyncHandler httpAsyncHandler = (IHttpAsyncHandler)handler;
this._sync = false;
this._handler = httpAsyncHandler;
Func<HttpContext, AsyncCallback, object, IAsyncResult> func = AppVerifier.WrapBeginMethod<HttpContext>(this._application, new Func<HttpContext, AsyncCallback, object, IAsyncResult>(httpAsyncHandler.BeginProcessRequest));
this._asyncStepCompletionInfo.Reset();
context.SyncContext.AllowVoidAsyncOperations();
IAsyncResult asyncResult;
try
{
//执行beginprocessrequest方法
asyncResult = func(context, this._completionCallback, null);
}
catch
{
context.SyncContext.ProhibitVoidAsyncOperations();
throw;
}
bool flag;
bool flag2;
this._asyncStepCompletionInfo.RegisterBeginUnwound(asyncResult, out flag, out flag2);
if (flag)
{
this._sync = true;
this._handler = null;
context.SyncContext.ProhibitVoidAsyncOperations();
try
{
if (flag2)
{
httpAsyncHandler.EndProcessRequest(asyncResult);
}
this._asyncStepCompletionInfo.ReportError();
}
finally
{
HttpApplication.CallHandlerExecutionStep.SuppressPostEndRequestIfNecessary(context);
context.Response.GenerateResponseHeadersForHandler();
}
if (EtwTrace.IsTraceEnabled(4, 4))
{
EtwTrace.Trace(EtwTraceType.ETW_TYPE_HTTPHANDLER_LEAVE, context.WorkerRequest);
return;
}
}
}
else
{
this._sync = true;
context.SyncContext.SetSyncCaller();
try
{
handler.ProcessRequest(context);
}
finally
{
context.SyncContext.ResetSyncCaller();
if (EtwTrace.IsTraceEnabled(4, 4))
{
EtwTrace.Trace(EtwTraceType.ETW_TYPE_HTTPHANDLER_LEAVE, context.WorkerRequest);
}
HttpApplication.CallHandlerExecutionStep.SuppressPostEndRequestIfNecessary(context);
context.Response.GenerateResponseHeadersForHandler();
}
}
}
执行步骤
internal override void ResumeSteps(Exception error)
{
bool flag = false;
bool flag2 = true;
HttpApplication application = this._application;
CountdownTask applicationInstanceConsumersCounter = application.ApplicationInstanceConsumersCounter;
HttpContext context = application.Context;
ThreadContext threadContext = null;
AspNetSynchronizationContextBase syncContext = context.SyncContext;
try
{
if (applicationInstanceConsumersCounter != null)
{
applicationInstanceConsumersCounter.MarkOperationPending();
}
using (syncContext.AcquireThreadLock())
{
try
{
threadContext = application.OnThreadEnter();
}
catch (Exception ex)
{
if (error == null)
{
error = ex;
}
}
try
{
try
{
while (true)
{
if (syncContext.Error != null)
{
error = syncContext.Error;
syncContext.ClearError();
}
if (error != null)
{
application.RecordError(error);
error = null;
}
if (syncContext.PendingCompletion(this._resumeStepsWaitCallback))
{
goto IL_123;
}
if (this._currentStepIndex < this._endRequestStepIndex && (context.Error != null || this._requestCompleted))
{
context.Response.FilterOutput();
this._currentStepIndex = this._endRequestStepIndex;
}
else
{
this._currentStepIndex++;
}
if (this._currentStepIndex >= this._execSteps.Length)
{
break;
}
this._numStepCalls++;
syncContext.Enable();
//执行每个事件中的Excute方法
error = application.ExecuteStep(this._execSteps[this._currentStepIndex], ref flag2);
if (!flag2)
{
goto IL_123;
}
this._numSyncStepCalls++;
}
flag = true;
IL_123:;
}
finally
{
if (flag)
{
context.RaiseOnRequestCompleted();
}
if (threadContext != null)
{
try
{
threadContext.DisassociateFromCurrentThread();
}
catch
{
}
}
}
}
catch
{
throw;
}
}
if (flag)
{
context.RaiseOnPipelineCompleted();
context.Unroot();
application.AsyncResult.Complete(this._numStepCalls == this._numSyncStepCalls, null, null);
application.ReleaseAppInstance();
}
}
finally
{
if (applicationInstanceConsumersCounter != null)
{
applicationInstanceConsumersCounter.MarkOperationCompleted();
}
}
}
集成模式同理
mvc5 源码解析2-2 mvchandler的执行的更多相关文章
- mvc5 源码解析2-1:mvchandler的执行
上一节说在urlroutingmodule中mvchandler 映射到httpcontext上,那mvchandler又是怎么执行的呢? (1).httpruntime 从isapiruntime ...
- [源码解析]Oozie来龙去脉之内部执行
[源码解析]Oozie来龙去脉之内部执行 目录 [源码解析]Oozie来龙去脉之内部执行 0x00 摘要 0x01 Oozie阶段 1.1 ActionStartXCommand 1.2 HiveAc ...
- mvc5 源码解析1:UrlRoutingModule
注册在C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG \webconfig中 在该module源码中 我们可以看出注册了application ...
- 【JVM源码解析】模板解释器解释执行Java字节码指令(上)
本文由HeapDump性能社区首席讲师鸠摩(马智)授权整理发布 第17章-x86-64寄存器 不同的CPU都能够解释的机器语言的体系称为指令集架构(ISA,Instruction Set Archit ...
- Celery 源码解析三: Task 对象的实现
Task 的实现在 Celery 中你会发现有两处,一处位于 celery/app/task.py,这是第一个:第二个位于 celery/task/base.py 中,这是第二个.他们之间是有关系的, ...
- Celery 源码解析五: 远程控制管理
今天要聊的话题可能被大家关注得不过,但是对于 Celery 来说确实很有用的功能,曾经我在工作中遇到这类情况,就是我们将所有的任务都放在同一个队列里面,然后有一天突然某个同学的代码写得不对,导致大量的 ...
- Celery 源码解析六:Events 的实现
在 Celery 中,除了远程控制之外,还有一个元素可以让我们对分布式中的任务的状态有所掌控,而且从实际意义上来说,这个元素对 Celery 更为重要,这就是在本文中将要说到的 Event. 在 Ce ...
- 6 admin(注册设计)源码解析、单例模式
1.单例模式 https://www.cnblogs.com/yuanchenqi/articles/8323452.html 单例模式(Singleton Pattern)是一种常用的软件设计模式, ...
- [源码解析] 并行分布式框架 Celery 之 worker 启动 (1)
[源码解析] 并行分布式框架 Celery 之 worker 启动 (1) 目录 [源码解析] 并行分布式框架 Celery 之 worker 启动 (1) 0x00 摘要 0x01 Celery的架 ...
随机推荐
- Java前后端的跨域问题
1 前端127.0.0.1:8888 2 后端127.0.0.1:8080 前端和后端因为来自不同的网域,所以在http的安全协议策略下,不信任 3 解决方案,在springmvc的控制层加入@Cro ...
- OpenStack Train版 简单部署流程
environment 1.网络平面 management(管理网络)→软件安装,组件通信 provider(提供实例网络)→:提供者网络:直接获取ip地址,实例之间直接互通 自服务网络(私有网络 ...
- Java结构讲解
Java结构有顺序结构.选择结构和循环结构. 顺序结构: 是Java的基本结构,除非特别说明,否则按顺序一句一句执行:也是最简单的结构:它是任何一个算法都离不开的一种基本算法结构. 选择结构: 1.i ...
- 【洛谷P5331】 [SNOI2019]通信
洛谷 题意: \(n\)个哨站排成一列,第\(i\)个哨站的频段为\(a_i\). 现在每个哨站可以选择: 直接连接到中心,代价为\(w\): 连接到前面某个哨站\(j(j<i)\),代价为\( ...
- Linux终端执行shell脚本,提示权限不够
在学习dubbo过程中,上传自己写的脚本,执行的时候提示“权限不够”,从网上了解到是因为没有为脚本赋权限 解决方法是使用chmod命令为shell脚本赋予权限 chmod 777 ./service- ...
- 201871010115 马北 《面向对象程序设计(java)》 第6-7周学习总结
项目 内容 <面向对象程序设计(java)> https://home.cnblogs.com/u/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.c ...
- centos用手机号无法登入安全狗的解决方法
前面我们安装好了安全狗,需要加服务器加入服云中,通常用sdcloud –u 用户名就可以,但如果是手机号的话就可能无法登陆,我们用sdcloud -h命令查看帮助,如下图所示 我们看到输入账号可以用- ...
- JDOJ 1065 打倒苏联修正主义
JDOJ 1065 https://neooj.com/oldoj/problem.php?id=1065 题目描述 [”客观”背景]苏修是苏联修正主义的简称.从1956年到1966年的10年间,过去 ...
- USACO Score Inflation
洛谷 P2722 总分 Score Inflation https://www.luogu.org/problem/P2722 JDOJ 1697: Score Inflation https://n ...
- VmWare下Ubuntu扩容问题
出现问题:拉不动,扩展不了分区大小: 解决:首先在设置了里面扩大硬盘大小: 之后下载Gparted工具:gparted-live-0.8.0-5.iso(下载地址:https://pan.baidu. ...