ASP.NET MVC 从IHttp到页面输出的实例代码
mvchandler : ihttphandler
void ihttphandler.processrequest(httpcontext httpcontext)
{
this.processrequest(httpcontext);
}
protected virtual void processrequest(httpcontext httpcontext)
{
httpcontextbase base2 = new httpcontextwrapper(httpcontext);
this.processrequest(base2);
}
protected internal virtual void processrequest(httpcontextbase httpcontext)
{
icontroller controller;
icontrollerfactory factory;
this.processrequestinit(httpcontext, out controller, out factory);
try
{
controller.execute(this.requestcontext);
}
finally
{
factory.releasecontroller(controller);
}
}
controller : controllerbase : icontroller
void icontroller.execute(requestcontext requestcontext) //------>controller
{
this.execute(requestcontext);
}
protected virtual void execute(requestcontext requestcontext) //------>controllerbase
{
if (requestcontext == null)
{
throw new argumentnullexception("requestcontext");
}
if (requestcontext.httpcontext == null)
{
throw new argumentexception(mvcresources.controllerbase_cannotexecutewithnullhttpcontext, "requestcontext");
}
this.verifyexecutecalledonce();
this.initialize(requestcontext);
using (scopestorage.createtransientscope())
{
this.executecore();
}
}
protected override void executecore() //------>controller
{
this.possiblyloadtempdata();
try
{
string requiredstring = this.routedata.getrequiredstring("action");
if (!this.actioninvoker.invokeaction(base.controllercontext, requiredstring)) //public iactioninvoker actioninvoker { get; set; }
{
this.handleunknownaction(requiredstring);
}
}
finally
{
this.possiblysavetempdata();
}
}
controlleractioninvoker : iactioninvoker
public virtual bool invokeaction(controllercontext controllercontext, string actionname)
{
if (controllercontext == null)
{
throw new argumentnullexception("controllercontext");
}
if (string.isnullorempty(actionname))
{
throw new argumentexception(mvcresources.common_nullorempty, "actionname");
}
controllerdescriptor controllerdescriptor = this.getcontrollerdescriptor(controllercontext);
actiondescriptor actiondescriptor = this.findaction(controllercontext, controllerdescriptor, actionname);
if (actiondescriptor == null)
{
return false;
}
filterinfo filters = this.getfilters(controllercontext, actiondescriptor);
try
{
authorizationcontext context = this.invokeauthorizationfilters(controllercontext, filters.authorizationfilters, actiondescriptor);
if (context.result != null)
{
this.invokeactionresult(controllercontext, context.result);
}
else
{
if (controllercontext.controller.validaterequest)
{
validaterequest(controllercontext);
}
idictionary<string, object> parametervalues = this.getparametervalues(controllercontext, actiondescriptor);
actionexecutedcontext context2 = this.invokeactionmethodwithfilters(controllercontext, filters.actionfilters, actiondescriptor, parametervalues);
this.invokeactionresultwithfilters(controllercontext, filters.resultfilters, context2.result);
}
}
catch (threadabortexception)
{
throw;
}
catch (exception exception)
{
exceptioncontext context3 = this.invokeexceptionfilters(controllercontext, filters.exceptionfilters, exception);
if (!context3.exceptionhandled)
{
throw;
}
this.invokeactionresult(controllercontext, context3.result);
}
return true;
}
protected virtual void invokeactionresult(controllercontext controllercontext, actionresult actionresult)
{
actionresult.executeresult(controllercontext);
}
actionresult
public override void executeresult(controllercontext context)
{
if (context == null)
{
throw new argumentnullexception("context");
}
if (string.isnullorempty(this.viewname))
{
this.viewname = context.routedata.getrequiredstring("action");
}
viewengineresult result = null;
if (this.view == null)
{
result = this.findview(context); //viewengineresult
this.view = result.view; //iview接口
}
textwriter output = context.httpcontext.response.output;
viewcontext viewcontext = new viewcontext(context, this.view, this.viewdata, this.tempdata, output);
this.view.render(viewcontext, output);
if (result != null)
{
result.viewengine.releaseview(context, this.view);
}
}