Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC路由在哪个请求事件中发生。_Asp.net Mvc_Http_Asp.net Mvc Routing_Httphandler - Fatal编程技术网

Asp.net mvc MVC路由在哪个请求事件中发生。

Asp.net mvc MVC路由在哪个请求事件中发生。,asp.net-mvc,http,asp.net-mvc-routing,httphandler,Asp.net Mvc,Http,Asp.net Mvc Routing,Httphandler,我已经经历了MVC请求生命周期,但我仍然没有弄清楚请求是如何根据注册的路由路由路由到处理程序的 我们将MVC请求与url放在一起,然后它会找到控制器并提供正确的cshtml页面。 由于url没有任何资源类型,因此http模块事件或http处理程序如何区分MVC请求并将其传递给正确的控制器。您可以从Microsoft的ASP.Net站点获得,详细描述MVC 5请求生命周期以及如何将其集成到ASP.Net生命周期中。pdf中图表的某些部分链接到msdn中的相关页面 另一个很好的资源来自Lukasz

我已经经历了MVC请求生命周期,但我仍然没有弄清楚请求是如何根据注册的路由路由路由到处理程序的

我们将MVC请求与url放在一起,然后它会找到控制器并提供正确的cshtml页面。 由于url没有任何资源类型,因此http模块事件或http处理程序如何区分MVC请求并将其传递给正确的控制器。

您可以从Microsoft的ASP.Net站点获得,详细描述MVC 5请求生命周期以及如何将其集成到ASP.Net生命周期中。pdf中图表的某些部分链接到msdn中的相关页面

另一个很好的资源来自Lukasz Lysic,它详细解释了MVC4中的请求生命周期

编辑:我不喜欢只链接的答案,所以我在下面添加了更多细节。


在机器级别的web.config上,您将看到注册为的。例如,在我的计算机上,我有:

<system.web>
   <httpModules>
      ...
      <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
      ...
   </httpModules>
<system.web>
因此,当请求与MVC路由匹配时,它将由
MvcRouteHandler
处理。如上所述,路由的
IRouteHandler
的目的是获取一个
IHttpHandler
,应用程序将使用它继续处理请求。
MvcRouteHandler
将返回一个
MvcHandler
,它是MVC特定管道的入口点

  • 检查类的
    GetHttpHandler
    方法:

MVC特定的管道基本上从
ProcessRequest
方法开始(或者异步
BeginProcessRequest
/
EndProcessRequest
)。
MvcHandler
将获得
IControllerFactory
(默认情况下,将被使用,除非您在global.asax应用程序中使用
ControllerBuilder.Current.SetDefaultControllerFactory
),使用它根据当前路由值创建控制器实例并启动控制器执行

  • 检查类的
    ProcessRequest
    方法:

这应该解释如何将传入请求与MVC中的控制器相匹配。对于MVC管道的其余部分,请检查文章开头的链接

您已经从Microsoft的ASP.Net站点获得了详细的MVC 5请求生命周期描述,以及如何将其集成到ASP.Net生命周期中。pdf中图表的某些部分链接到msdn中的相关页面

另一个很好的资源来自Lukasz Lysic,它详细解释了MVC4中的请求生命周期

编辑:我不喜欢只链接的答案,所以我在下面添加了更多细节。


在机器级别的web.config上,您将看到注册为的。例如,在我的计算机上,我有:

<system.web>
   <httpModules>
      ...
      <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
      ...
   </httpModules>
<system.web>
因此,当请求与MVC路由匹配时,它将由
MvcRouteHandler
处理。如上所述,路由的
IRouteHandler
的目的是获取一个
IHttpHandler
,应用程序将使用它继续处理请求。
MvcRouteHandler
将返回一个
MvcHandler
,它是MVC特定管道的入口点

  • 检查类的
    GetHttpHandler
    方法:

MVC特定的管道基本上从
ProcessRequest
方法开始(或者异步
BeginProcessRequest
/
EndProcessRequest
)。
MvcHandler
将获得
IControllerFactory
(默认情况下,将被使用,除非您在global.asax应用程序中使用
ControllerBuilder.Current.SetDefaultControllerFactory
),使用它根据当前路由值创建控制器实例并启动控制器执行

  • 检查类的
    ProcessRequest
    方法:


这应该解释如何将传入请求与MVC中的控制器相匹配。对于MVC管道的其余部分,请检查文章开头的链接

试试谷歌的MVC管道。例如,ASP.Net站点描述了MVC5管道。或者这是描述MVC的4@DanielJ.G. 谢谢,MVC4的幻灯片非常详细,谢谢。你们能把这个写在答案部分,把它标记为答案吗?我认为这本身并不是一个请求事件。您可能正在询问HttpApplication实例上的事件。如果我错了,请纠正我。@deocwalk danny提供的链接(“幻灯片集”)回答了http模块中路由处理程序是如何完成的,回答了我的澄清。是的,我同意答案。您特别感兴趣的事件是发生在HttpApplication实例上的PostRequestResolveCache。这就是UrlRoutingModule完成大部分工作的地方。例如,ASP.Net站点描述了MVC5管道。或者这是描述MVC的4@DanielJ.G. 谢谢,MVC4的幻灯片非常详细,谢谢。你们能把这个写在答案部分,把它标记为答案吗?我认为这本身并不是一个请求事件。您可能正在询问HttpApplication实例上的事件。如果我错了,请纠正我。@deocwalk danny提供的链接(“幻灯片集”)回答了http模块中路由处理程序是如何完成的,回答了我的澄清。是的,我同意答案。您特别感兴趣的事件是发生在HttpApplication实例上的PostRequestResolveCache。这就是UrlRoutingModule完成大部分工作的地方。
protected virtual IHttpHandler GetHttpHandler(RequestContext requestContext)
{
    requestContext.HttpContext.SetSessionStateBehavior(GetSessionStateBehavior(requestContext));
    return new MvcHandler(requestContext);
}
protected internal virtual void ProcessRequest(HttpContextBase httpContext)
{
    IController controller;
    IControllerFactory factory;
    ProcessRequestInit(httpContext, out controller, out factory);

    try
    {
        controller.Execute(RequestContext);
    }
    finally
    {
        factory.ReleaseController(controller);
    }
}

private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory)
{
    // If request validation has already been enabled, make it lazy. This allows attributes like [HttpPost] (which looks
    // at Request.Form) to work correctly without triggering full validation.
    // Tolerate null HttpContext for testing.
    HttpContext currentContext = HttpContext.Current;
    if (currentContext != null)
    {
        bool? isRequestValidationEnabled = ValidationUtility.IsValidationEnabled(currentContext);
        if (isRequestValidationEnabled == true)
        {
            ValidationUtility.EnableDynamicValidation(currentContext);
        }
    }

    AddVersionHeader(httpContext);
    RemoveOptionalRoutingParameters();

    // Get the controller type
    string controllerName = RequestContext.RouteData.GetRequiredString("controller");

    // Instantiate the controller and call Execute
    factory = ControllerBuilder.GetControllerFactory();
    controller = factory.CreateController(RequestContext, controllerName);
    if (controller == null)
    {
        throw new InvalidOperationException(
            String.Format(
                CultureInfo.CurrentCulture,
                MvcResources.ControllerBuilder_FactoryReturnedNull,
                factory.GetType(),
                controllerName));
    }
}