IHttpHandler IHttpHandlerFactory.GetHandler(HttpContext context, string requestType, string virtualPath, string physicalPath) { // 说明:这里不使用virtualPath变量,因为不同的配置,这个变量的值会不一样。 // 例如:/mvc/*/*.aspx 和 /mvc/* // 为了映射HTTP处理器,下面直接使用context.Request.Path string requestPath = context.Request.Path; string vPath = UrlHelper.GetRealVirtualPath(context, requestPath); var data = PageUrl2ControllerTypeCache.DefaultPageUrl2ControllerTypeCache .GetDescriptor(PageUrlAttribute.ConvertToUniqueId(vPath, context.Request.HttpMethod)); // 如果没有找到合适的Action,并且请求的是一个ASPX页面,则按ASP.NET默认的方式来继续处理 if (data == null && requestPath.EndsWith(".aspx", StringComparison.OrdinalIgnoreCase)) { if (_msPageHandlerFactory == null) { _msPageHandlerFactory = new AspnetPageHandlerFactory(); } // 调用ASP.NET默认的Page处理器工厂来处理 return(_msPageHandlerFactory.GetHandler(context, requestType, requestPath, physicalPath)); } RequestContext requestContext = new RequestContext(context, new Route(vPath) { UsePageUrlRoute = true, PageUrlData = data, Controller = data.Item1.Name, Action = data.Item2.Name }); return(new MvcHandlerBuilder().Create(requestContext)); }
/// <summary> /// 尝试根据当前请求,获取一个有效的Action,并返回ActionHandler /// 此方法可以在HttpModule中使用,用于替代httpHandler的映射配置 /// </summary> /// <param name="context"></param> /// <returns></returns> public static IHttpHandler TryGetHandler(HttpContext context) { string vPath = UrlHelper.GetRealVirtualPath(context, context.Request.FilePath); var data = PageUrl2ControllerTypeCache.DefaultPageUrl2ControllerTypeCache .GetDescriptor(PageUrlAttribute.ConvertToUniqueId(vPath, context.Request.HttpMethod)); if (data == null) { return(null); } RequestContext requestContext = new RequestContext(context, new Route(vPath) { UsePageUrlRoute = true, PageUrlData = data }); return(new MvcHandlerBuilder().Create(requestContext)); }