Exemplo n.º 1
0
        internal static IControllerFactory Proxy(this IControllerFactory iControllerFactory, IGlimpseLogger logger)
        {
            if (iControllerFactory.CanSupportDynamicProxy(logger))
            {
                var proxyConfig = new Dictionary <string, IInterceptor>
                {
                    { "CreateController", new CreateControllerInterceptor(logger) }
                };

                var proxyGenerator  = new ProxyGenerator();
                var proxyGenOptions = new ProxyGenerationOptions(new SimpleProxyGenerationHook(logger, proxyConfig.Keys.ToArray()))
                {
                    Selector = new SimpleInterceptorSelector(proxyConfig)
                };
                var newInvoker = (IControllerFactory)proxyGenerator.CreateClassProxy(iControllerFactory.GetType(), proxyGenOptions, proxyConfig.Values.ToArray());

                return(newInvoker);
            }

            logger.Warn("Unable to proxy {0}", iControllerFactory.GetType());

            return(iControllerFactory);



            //if (iControllerFactory is GlimpseControllerFactory) return iControllerFactory;

            //return new GlimpseControllerFactory(iControllerFactory, logger);
        }
        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));
            }
        }
Exemplo n.º 3
0
        protected internal virtual IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object state)
        {
            AddVersionHeader(httpContext);

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

            // Instantiate the controller and call Execute
            IControllerFactory factory    = ControllerBuilder.GetControllerFactory();
            IController        controller = factory.CreateController(RequestContext, controllerName);

            if (controller == null)
            {
                throw new InvalidOperationException(
                          String.Format(
                              CultureInfo.CurrentUICulture,
                              MvcResources.ControllerBuilder_FactoryReturnedNull,
                              factory.GetType(),
                              controllerName));
            }

            BeginExecuteDelegate beginExecute;
            EndExecuteDelegate   endExecute;

            IAsyncController asyncController = controller as IAsyncController;

            if (asyncController != null)
            {
                beginExecute = asyncController.BeginExecute;
                endExecute   = asyncController.EndExecute;
            }
            else
            {
                // execute synchronous controller asynchronously
                ExecuteDelegate executeDelegate = rc => SynchronizationContext.Sync(() => controller.Execute(rc));
                beginExecute = executeDelegate.BeginInvoke;
                endExecute   = executeDelegate.EndInvoke;
            }

            BeginInvokeCallback beginCallback = (innerCallback, innerState) => {
                try {
                    return(beginExecute(RequestContext, innerCallback, innerState));
                }
                catch {
                    factory.ReleaseController(controller);
                    throw;
                }
            };

            AsyncCallback endCallback = ar => {
                try {
                    endExecute(ar);
                }
                finally {
                    factory.ReleaseController(controller);
                }
            };

            return(AsyncResultWrapper.Wrap(callback, state, beginCallback, endCallback, _processRequestTag));
        }
Exemplo n.º 4
0
        public ControllerFactoryProvider(
            IControllerActivatorProvider activatorProvider,
            IControllerFactory controllerFactory,
#pragma warning disable PUB0001 // Pubternal type in public API
            IEnumerable <IControllerPropertyActivator> propertyActivators
#pragma warning restore PUB0001
            )
        {
            if (activatorProvider == null)
            {
                throw new ArgumentNullException(nameof(activatorProvider));
            }

            if (controllerFactory == null)
            {
                throw new ArgumentNullException(nameof(controllerFactory));
            }

            _activatorProvider = activatorProvider;

            // Compat: Delegate to the IControllerFactory if it's not the default implementation.
            if (controllerFactory.GetType() != typeof(DefaultControllerFactory))
            {
                _factoryCreateController  = controllerFactory.CreateController;
                _factoryReleaseController = controllerFactory.ReleaseController;
            }

            _propertyActivators = propertyActivators.ToArray();
        }
Exemplo n.º 5
0
        protected internal virtual void ProcessRequest(HttpContextBase httpContext)
        {
            AddVersionHeader(httpContext);

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

            // Instantiate the controller and call Execute
            IControllerFactory factory    = ControllerBuilder.GetControllerFactory();
            IController        controller = factory.CreateController(RequestContext, controllerName);

            if (controller == null)
            {
                throw new InvalidOperationException(
                          String.Format(
                              CultureInfo.CurrentUICulture,
                              MvcResources.ControllerBuilder_FactoryReturnedNull,
                              factory.GetType(),
                              controllerName));
            }
            try {
                controller.Execute(RequestContext);
            }
            finally {
                factory.ReleaseController(controller);
            }
        }
        public ControllerFactoryProvider(
            IControllerActivatorProvider activatorProvider,
            IControllerFactory controllerFactory,
            IEnumerable <IControllerPropertyActivator> propertyActivators)
        {
            if (activatorProvider == null)
            {
                throw new ArgumentNullException(nameof(activatorProvider));
            }

            if (controllerFactory == null)
            {
                throw new ArgumentNullException(nameof(controllerFactory));
            }

            _activatorProvider = activatorProvider;

            // Compat: Delegate to the IControllerFactory if it's not the default implementation.
            if (controllerFactory.GetType() != typeof(DefaultControllerFactory))
            {
                _factoryCreateController       = controllerFactory.CreateController;
                _factoryReleaseController      = controllerFactory.ReleaseController;
                _factoryReleaseControllerAsync = controllerFactory.ReleaseControllerAsync;
            }

            _propertyActivators = propertyActivators.ToArray();
        }
Exemplo n.º 7
0
        public void DefaultControllerFactoryIsDefaultControllerFactory()
        {
            // Arrange
            ControllerBuilder builder = new ControllerBuilder();

            // Act
            IControllerFactory returnedControllerFactory = builder.GetControllerFactory();

            //Assert
            Assert.Equal(typeof(DefaultControllerFactory), returnedControllerFactory.GetType());
        }
Exemplo n.º 8
0
        public static ControllerBase GetControllerByName(this HtmlHelper htmlHelper, string controllerName)
        {
            IControllerFactory factory    = ControllerBuilder.Current.GetControllerFactory();
            IController        controller = factory.CreateController(htmlHelper.ViewContext.RequestContext, controllerName);

            if (controller == null)
            {
                throw new InvalidOperationException(
                          String.Format(
                              CultureInfo.CurrentCulture,
                              "The IControllerFactory '{0}' did not return a controller for the name '{1}'. Controller not Found.",
                              factory.GetType(), controllerName));
            }
            return((ControllerBase)controller);
        }
Exemplo n.º 9
0
        static ControllerBase GetControllerByName(HtmlHelper helper, string controllerName)
        {
            IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();

            IController controller = factory.CreateController(helper.ViewContext.RequestContext, controllerName);

            if (controller == null)
            {
                throw new InvalidOperationException(
                          string.Format(
                              System.Globalization.CultureInfo.CurrentUICulture,
                              "Controller factory {0} controller {1} returned null",
                              factory.GetType(),
                              controllerName));
            }

            return((ControllerBase)controller);
        }
Exemplo n.º 10
0
        internal static bool CanSupportDynamicProxy(this IControllerFactory controllerFactory, IGlimpseLogger logger)
        {
            //Make sure there is a parameterless constructor and the type is not sealed
            var controllerFactoryType = controllerFactory.GetType();
            var proxy = controllerFactory as IProxyTargetAccessor;
            var defaultConstructor = controllerFactoryType.GetConstructor(new Type[] { });

            var result = (!controllerFactoryType.IsSealed &&
                          defaultConstructor != null &&
                          proxy == null);

            if (!result)
            {
                //TODO: Add logging
            }

            return(result);
        }
Exemplo n.º 11
0
        private static ControllerBase GetControllerByName(HtmlHelper helper, string controllerName)
        {
            // Instantiate the controller and call Execute
            IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();

            IController controller = factory.CreateController(helper.ViewContext.RequestContext, controllerName);

            if (controller == null)
            {
                throw new InvalidOperationException(
                          String.Format(
                              CultureInfo.CurrentUICulture,
                              "Controller factory {0} controller {1} returned null",
                              factory.GetType(),
                              controllerName));
            }

            return((ControllerBase)controller);
        }
Exemplo n.º 12
0
        private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory)
        {
            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.CurrentUICulture,
                              MvcResources.ControllerBuilder_FactoryReturnedNull,
                              factory.GetType(),
                              controllerName));
            }
        }
Exemplo n.º 13
0
            public void ProcessRequestInternal(HttpContextBase httpContext)
            {
                AddVersionHeader(httpContext);
                string             requiredString    = RequestContext.RouteData.GetRequiredString("controller");
                IControllerFactory controllerFactory = ControllerBuilder.Current.GetControllerFactory();
                IController        controller        = controllerFactory.CreateController(RequestContext, requiredString);

                if (controller == null)
                {
                    throw new InvalidOperationException(string.Format(CultureInfo.CurrentUICulture,
                                                                      "The IControllerFactory '{0}' did not return a controller for a controller named '{1}'.",
                                                                      new object[] { controllerFactory.GetType(), requiredString }));
                }
                try
                {
                    ((ControllerBase)controller).ValidateRequest = _validateRequest;
                    controller.Execute(RequestContext);
                }
                finally
                {
                    controllerFactory.ReleaseController(controller);
                }
            }
Exemplo n.º 14
0
        private static ControllerBase GetControllerByName(ViewContext viewContext, string controllerName, bool useNamespaceFallback)
        {
            // Instantiate the controller and call Execute
            IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();

            if (useNamespaceFallback)
            {
                viewContext.RequestContext.RouteData.DataTokens["UseNamespaceFallback"] = true;
            }

            IController controller = factory.CreateController(viewContext.RequestContext, controllerName);

            if (controller == null)
            {
                throw new InvalidOperationException(
                          String.Format(
                              CultureInfo.CurrentUICulture,
                              "Controller factory {0} controller {1} returned null",
                              factory.GetType(),
                              controllerName));
            }

            return((ControllerBase)controller);
        }
Exemplo n.º 15
0
        /// <summary>
        /// 通过Http上下文对象创建对应的controller工厂和controller
        /// </summary>
        /// <param name="httpContext">封装的Http上下文</param>
        /// <param name="controller">返回当前请求的controller实例</param>
        /// <param name="factory">返回controller工厂实例</param>
        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);
                }
            }

            // 在响应头中返回MVC的版本号信息 如:X-AspNetMvc-Version  5.0
            AddVersionHeader(httpContext);
            // 移除路由数据中的可选项Optional
            RemoveOptionalRoutingParameters();

            // 获取当前请求的控制器名称
            // Get the controller type
            string controllerName = RequestContext.RouteData.GetRequiredString("controller");

            // 通过工厂创建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));
            }
        }
Exemplo n.º 16
0
        private void ProcessRequestInit(HttpContextBase httpContext, out IController controller, out IControllerFactory factory)
        {
            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.CurrentUICulture,
                        MvcResources.ControllerBuilder_FactoryReturnedNull,
                        factory.GetType(),
                        controllerName));
            }
        }