/// <summary> /// 根据一个Action的调用信息(类名与方法名),返回内部表示的调用信息。 /// </summary> /// <param name="pair"></param> /// <returns></returns> public static InvokeInfo GetActionInvokeInfo(ControllerActionPair pair, HttpRequest request) { if (pair == null) { throw new ArgumentNullException("pair"); } InvokeInfo vkInfo = new InvokeInfo(); vkInfo.Controller = GetServiceController(pair.Controller); if (vkInfo.Controller == null) { return(null); } vkInfo.Action = GetServiceAction(vkInfo.Controller.ControllerType, pair.Action, request); if (vkInfo.Action == null) { return(null); } if (vkInfo.Action.MethodInfo.IsStatic == false) { //vkInfo.Instance = Activator.CreateInstance(vkInfo.Controller.ControllerType); vkInfo.Instance = vkInfo.Controller.ControllerType.FastNew(); } return(vkInfo); }
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); // 尝试根据请求路径获取Action InvokeInfo vkInfo = ReflectionHelper.GetActionInvokeInfo(vPath); // 如果没有找到合适的Action,并且请求的是一个ASPX页面,则按ASP.NET默认的方式来继续处理 if (vkInfo == null && requestPath.EndsWith(".aspx", StringComparison.OrdinalIgnoreCase)) { if (_msPageHandlerFactory == null) { _msPageHandlerFactory = new AspnetPageHandlerFactory(); } // 调用ASP.NET默认的Page处理器工厂来处理 return(_msPageHandlerFactory.GetHandler(context, requestType, requestPath, physicalPath)); } return(ActionHandler.CreateHandler(vkInfo)); }
public IHttpHandler GetHandler(HttpContext context, string requestType, string virtualPath, string physicalPath) { // 说明:这里不使用virtualPath变量,因为不同的配置,这个变量的值会不一样。 // 例如:/Ajax/*/*.aspx 和 /Ajax/* // 为了映射HTTP处理器,下面直接使用context.Request.Path string vPath = UrlHelper.GetRealVirtualPath(context, context.Request.Path); // 根据请求路径,定位到要执行的Action ControllerActionPair pair = ParseUrl(context, vPath); if (pair == null) { ExceptionHelper.Throw404Exception(context); } // 获取内部表示的调用信息 InvokeInfo vkInfo = ReflectionHelper.GetActionInvokeInfo(pair, context.Request); if (vkInfo == null) { ExceptionHelper.Throw404Exception(context); } // 创建能够调用Action的HttpHandler return(ActionHandler.CreateHandler(vkInfo)); }
public static void TrySetPageModel(HttpContext context) { if (context == null || context.Handler == null) { return; } IHttpHandler handler = context.Handler; // 判断当前处理器是否从MyPageView<TModel>继承过来 Type handlerType = handler.GetType().BaseType; if (handlerType.IsGenericType && handlerType.GetGenericTypeDefinition() == MyPageViewOpenType) { // 查找能响应这个请求的Action,并获取视图数据。 InvokeInfo vkInfo = ReflectionHelper.GetActionInvokeInfo(context.Request.FilePath); if (vkInfo == null) { return; } object model = ActionExecutor.ExecuteActionInternal(context, vkInfo); // 设置页面Model SetPageModel(context.Handler, model); } }
public static ActionHandler CreateHandler(InvokeInfo vkInfo) { SessionMode mode = vkInfo.GetSessionMode(); if (mode == SessionMode.NotSupport) { return new ActionHandler { InvokeInfo = vkInfo } } ; else if (mode == SessionMode.ReadOnly) { return new ReadOnlySessionActionHandler { InvokeInfo = vkInfo } } ; else { return new RequiresSessionActionHandler { InvokeInfo = vkInfo } }; } }
internal static void ExecuteAction(HttpContext context, InvokeInfo vkInfo) { if (context == null) { throw new ArgumentNullException("context"); } if (vkInfo == null) { throw new ArgumentNullException("vkInfo"); } SetMvcVersionHeader(context); LogAttribute logAttr = vkInfo.GetLogAttribute(); if (logAttr != null) { logAttr.Log(context); } // 验证请求是否允许访问(身份验证) AuthorizeAttribute authorize = vkInfo.GetAuthorize(); if (authorize != null) { if (authorize.AuthenticateRequest(context) == false) { throw new PermissionDeniedException(); } //ExceptionHelper.Throw403Exception(context); } // ASP.NET的安全检查 if (vkInfo.Action.Attr.NeedValidateRequest()) { context.Request.ValidateInput(); } // 调用方法 object result = ExecuteActionInternal(context, vkInfo); // 设置OutputCache OutputCacheAttribute outputCache = vkInfo.GetOutputCacheSetting(); if (outputCache != null) { outputCache.SetResponseCache(context); } // 处理方法的返回结果 OutputActionResult(context, result); }
/// <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); InvokeInfo vkInfo = ReflectionHelper.GetActionInvokeInfo(vPath); if (vkInfo == null) { return(null); } return(ActionHandler.CreateHandler(vkInfo)); }
/// <summary> /// 根据一个页面请求路径,返回内部表示的调用信息。 /// </summary> /// <param name="url"></param> /// <returns></returns> public static InvokeInfo GetActionInvokeInfo(string url) { if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } MatchActionDescription md = null; ActionDescription action = null; // 先直接用URL从字典中查找匹配项。 if (s_PageActionDict.TryGetValue(url, out action) == false) { // 如果不能直接匹配URL,就用正则表达式再逐个匹配。 md = GetActionUsingRegex(url); if (md == null) { return(null); } else { action = md.ActionDescription; } } InvokeInfo vkInfo = new InvokeInfo(); vkInfo.Controller = action.PageController; vkInfo.Action = action; if (md != null) { vkInfo.RegexMatch = md.Match; } if (vkInfo.Action.MethodInfo.IsStatic == false) { //vkInfo.Instance = Activator.CreateInstance(vkInfo.Controller.ControllerType); vkInfo.Instance = vkInfo.Controller.ControllerType.FastNew(); } return(vkInfo); }
internal static object ExecuteActionInternal(HttpContext context, InvokeInfo info) { // 准备要传给调用方法的参数 object[] parameters = GetActionCallParameters(context, info.Action); // 调用方法 if (info.Action.HasReturn) { //return info.Action.MethodInfo.Invoke(info.Instance, parameters); return(info.Action.MethodInfo.FastInvoke(info.Instance, parameters)); } else { //info.Action.MethodInfo.Invoke(info.Instance, parameters); info.Action.MethodInfo.FastInvoke(info.Instance, parameters); return(null); } }
/// <summary> /// 获取当前执行的Action信息 /// </summary> /// <param name="context"></param> /// <returns></returns> public BehaviorActionInfo GetActionInfo(HttpContext context) { bool isAjaxRequest = string.Compare(context.Request.Headers["X-Requested-With"], "XMLHttpRequest", StringComparison.OrdinalIgnoreCase) == 0; BehaviorActionInfo action = new BehaviorActionInfo(); InvokeInfo vkInfo = null; if (isAjaxRequest) { string vPath = UrlHelper.GetRealVirtualPath(context, context.Request.Path); ControllerActionPair pair = new AjaxHandlerFactory().ParseUrl(context, vPath); if (pair == null) { ExceptionHelper.Throw404Exception(context); } // 获取内部表示的调用信息 vkInfo = ReflectionHelper.GetActionInvokeInfo(pair, context.Request); } else { string requestPath = context.Request.Path; string vPath = UrlHelper.GetRealVirtualPath(context, requestPath); // 尝试根据请求路径获取Action vkInfo = ReflectionHelper.GetActionInvokeInfo(vPath); } if (vkInfo != null) { action.ActionName = vkInfo.Action.MethodInfo.Name; action.ControllerName = vkInfo.Controller.ControllerType.Name; object[] Values = ActionParametersProviderFactory.CreateActionParametersProvider(context).GetParameters(context, vkInfo.Action); for (int i = 0; i < vkInfo.Action.Parameters.Length; i++) { action.Parameters.Add(new { Name = vkInfo.Action.Parameters[i].Name, Value = Values[i] }); } } return(action); }