none
ASP.NET MVC2.0重写的MvcHandler问题,大哥大姐们帮帮我吧 RRS feed

  • 问题

  • 各位大牛,今天搞了我头昏脑胀,我继承了MvcHandler,并且重写了protected override void ProcessRequest(HttpContext httpContext)。确没见程序执行到我重写的方法中,IRouteHandler已经重写了,gloabl.asax中也配置好了路由

    public
     IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
     return
     new
     YHMVCHandler(requestContext);
    }
    

     

    在Controller中调试看了HttpContext.Handler和CurrentHandler都是我自定义的MvcHandler类型,可是就是没有调用自定义的ProcessRequest方法。实在是莫名其妙

     

    2010年5月2日 14:08

答案

  • 你好,

    我刚才调试了下ASP.NET MVC RC版本的源码。

    源码中的确没有运行ProcessRequest这个方法,它执行完BeginProcessRequest方法后就跳出了。

    所以如果你要实现你的逻辑,可以重写BeginProcessRequest方法。


    Microsoft Online Community Support
    • 已标记为答案 Mao.Mozily 2010年5月7日 8:19
    2010年5月7日 2:29

全部回复

  • 估计是版本冲突的问题,我的项目引用程序集有点乱。我用vs2008新建ASP.NET MVC1.0没什么问题,我上面描述的问题出现在vs2010中的ASP.NET MVC2.0中
    2010年5月2日 14:22
  • 我发现在asp.net mvc2.0中重写MvcHandler没有任何作用呢?不会要我完全重新写个IHttpHandler吧
    2010年5月2日 14:37
  • 你好,

    你在global中是怎么设置的?能否贴出代码?

    另外有没有试试在web.config中的<httpHandlers>中设置成你自定义的handler.


    Microsoft Online Community Support
    2010年5月5日 2:17
  •   public static void RegisterRoutes(RouteCollection routes)
      {
       routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
       routes.Add("default",
          new Route("{controller}/{action}/{id}", new TestRouteHandler())
           {
            Defaults = new RouteValueDictionary(new {controller = "Home", action = "Index", id = ""})
           });
      }
     public class TestRouteHandler:IRouteHandler
     {
      #region Implementation of IRouteHandler
    
      public IHttpHandler GetHttpHandler(RequestContext requestContext)
      {
       return new TestMvcHandler(requestContext);
      }
    
      #endregion
     }
     public class TestMvcHandler:MvcHandler
     {
      public TestMvcHandler():base(HttpContext.Current.Request.RequestContext)
      {
      }
    
      public TestMvcHandler(RequestContext requestContext) : base(requestContext)
      {
      }
      protected override void ProcessRequest(System.Web.HttpContext httpContext)
      {
       base.ProcessRequest(httpContext);
      }
     }
    另外,如果在web.config中配置了我的handler,那么在一个请求中,handler的两个构造函数都会被调用一次。并且即使配了也不会调用我的override方法。
    2010年5月6日 11:12
  • 你好,

    我刚才调试了下ASP.NET MVC RC版本的源码。

    源码中的确没有运行ProcessRequest这个方法,它执行完BeginProcessRequest方法后就跳出了。

    所以如果你要实现你的逻辑,可以重写BeginProcessRequest方法。


    Microsoft Online Community Support
    • 已标记为答案 Mao.Mozily 2010年5月7日 8:19
    2010年5月7日 2:29
  • 谢谢啊,我一直以为BeginProcessRequest只是用来执行异步处理请求的,关于异步处理我没大去学习。太谢谢你了,花时间在这个问题上!
    2010年5月7日 8:18
  • 能不能帮我解答下,既然不调用ProcessRequet这个方法进行请求处理了,那底层应该没有使用IHttpHandler来处理请求了,而是直接使用了IHttpAsyncHandler的接口引用了我的handler,那何必又要IHttpHandler?只是为了向下兼容吗?
    2010年5月7日 8:29
  • 你好,

    这个问题我就没法解答了。这个可能是设计者出于某种意图,但是我也不清楚。我只是通过他们提供的源码的调试知道ProcessRequet没有被执行。

    你也可以下载个源码调试下试试。http://aspnet.codeplex.com/releases/view/41742#DownloadId=110347


    Microsoft Online Community Support
    2010年5月7日 8:49
  • 谢谢了,每次都有个你好,太客气了,呵呵。谢谢
    2010年5月7日 15:08