示例#1
0
        /// <summary>Registers all APIs into the ASP.net pipeline.</summary>
        /// <param name="application">The application to work with.</param>
        /// <returns>The application itself.</returns>
        public static HttpApplication RegisterApis(this HttpApplication application)
        {
            if (application == null)
            {
                throw new ArgumentNullException("application");
            }

            lock (Lock)
            {
                var routes    = new Dictionary <string, Route>();
                var container = UrsaConfigurationSection.InitializeComponentProvider();
                container.Register <IHttpServerConfiguration, HttpContextBoundServerConfiguration>();
                container.WithAutodiscoveredControllers((controller, description) =>
                {
                    var routesToAdd = (IDictionary <string, Route>)RegisterApiT.MakeGenericMethod(controller).Invoke(null, new object[] { container, description });
                    routes.AddRange(routesToAdd.Where(route => !routes.ContainsKey(route.Key)));
                });
                var namedGraphSelector = container.Resolve <INamedGraphSelector>() as ILocallyControlledNamedGraphSelector;
                if (namedGraphSelector != null)
                {
                    namedGraphSelector.CurrentRequest = () => HttpContext.Current.Items["URSA.Http.RequestInfo"] as IRequestInfo;
                }

                routes.ForEach(route => RouteTable.Routes.Add(route.Key, route.Value));
            }

            return(application);
        }
示例#2
0
        /// <summary>Registers automatically discovered <see cref="IController" /> implementations.</summary>
        /// <param name="container">The container.</param>
        /// <param name="controllerDetailsAction">The controller details action.</param>
        /// <returns>The <paramref name="container" /> itself.</returns>
        public static IComponentProvider WithAutodiscoveredControllers(this IComponentProvider container, Action <Type, ControllerInfo> controllerDetailsAction = null)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }

            var assemblies = UrsaConfigurationSection.GetInstallerAssemblies();

            container.RegisterAll <IController>(assemblies);
            var controllers = container.ResolveAllTypes <IController>();

            container.RegisterControllerRelatedTypes(controllers);
            var registeredEntryPoints = new List <string>();

            foreach (var controller in controllers.Where(controller => !controller.IsDescriptionController()))
            {
                var descriptionBuilder = (IHttpControllerDescriptionBuilder)container.Resolve(typeof(IHttpControllerDescriptionBuilder <>).MakeGenericType(controller));
                var description        = descriptionBuilder.BuildDescriptor();
                if ((description.EntryPoint != null) && (!registeredEntryPoints.Contains(description.EntryPoint.ToString())))
                {
                    container.RegisterEntryPointControllerDescriptionBuilder(description.EntryPoint.Url);
                    registeredEntryPoints.Add(description.EntryPoint.ToString());
                }

                if (controllerDetailsAction != null)
                {
                    controllerDetailsAction(controller, description);
                }
            }

            return(container);
        }
示例#3
0
        private static IApiDocumentation GetApiDocumentation(HttpUrl url)
        {
            string contentType;
            var    responseStream = new UnclosableStream(GetResponse(Method, url, out contentType));
            var    container      = UrsaConfigurationSection.InitializeComponentProvider();

            container.Register <IHttpServerConfiguration>(new StaticHttpServerConfiguration((Uri)url));
            var headers = new HeaderCollection();

            if (!String.IsNullOrEmpty(contentType))
            {
                ((IDictionary <string, string>)headers)[Header.Accept]      = contentType;
                ((IDictionary <string, string>)headers)[Header.ContentType] = contentType;
            }

            var apiDocumentationId = url.WithFragment(String.Empty);
            var httpRequest        = new RequestInfo(Verb.Parse(Method), apiDocumentationId, responseStream, new BasicClaimBasedIdentity(), headers);
            var converterProvider  = container.Resolve <IConverterProvider>();
            var converter          = converterProvider.FindBestInputConverter <IApiDocumentation>(httpRequest);

            if (converter == null)
            {
                throw new NotSupportedException(String.Format("Content type of '{0}' is not supported.", contentType));
            }

            converter.ConvertTo <IApiDocumentation>(httpRequest);
            return(_container.Resolve <IEntityContext>().Load <IApiDocumentation>((Uri)apiDocumentationId));
        }
示例#4
0
        /// <summary>Registers an identity provider.</summary>
        /// <typeparam name="T">Type of the identity provider to use.</typeparam>
        /// <param name="application">The application to work with.</param>
        /// <returns>The application itself.</returns>
        public static HttpApplication WithIdentityProvider <T>(this HttpApplication application) where T : IIdentityProvider
        {
            if (application == null)
            {
                throw new ArgumentNullException("application");
            }

            var container = UrsaConfigurationSection.InitializeComponentProvider();

            container.Register <IIdentityProvider, T>(lifestyle: Lifestyles.Singleton);
            return(application);
        }
示例#5
0
        /// <summary>Registers the Basic authentication mechanism and sets it as a default one.</summary>
        /// <param name="application">The application to work with.</param>
        /// <returns>The application itself.</returns>
        public static HttpApplication WithBasicAuthentication(this HttpApplication application)
        {
            if (application == null)
            {
                throw new ArgumentNullException("application");
            }

            var container = UrsaConfigurationSection.InitializeComponentProvider();

            container.Register <IPreRequestHandler, BasicAuthenticationProvider>("Basic", lifestyle: Lifestyles.Singleton);
            container.Register <IPostRequestHandler, BasicAuthenticationProvider>(lifestyle: Lifestyles.Singleton);
            return(application);
        }
示例#6
0
        private Client()
        {
            IComponentProvider container = UrsaConfigurationSection.InitializeComponentProvider();

            _webRequestProvider = (from webRequestProvider in container.ResolveAll <IWebRequestProvider>()
                                   from supportedProtocol in webRequestProvider.SupportedProtocols
                                   join allowedProtocol in AllowedProtocols on supportedProtocol equals allowedProtocol
                                   select webRequestProvider).FirstOrDefault();
            if (_webRequestProvider == null)
            {
                throw new InvalidOperationException("Cannot create an HTTP client without proper web request provider.");
            }

            _converterProvider = container.Resolve <IConverterProvider>();
            _resultBinder      = container.Resolve <IResultBinder <RequestInfo> >();
        }
示例#7
0
        /// <summary>Registers the Cross-Origin Resource Sharing component to be used.</summary>
        /// <param name="application">The application to work with.</param>
        /// <param name="allowedOrigins">Allowed origins.</param>
        /// <param name="allowedHeaders">Allowed headers.</param>
        /// <param name="exposedHeaders">Exposed headers.</param>
        /// <returns>The application itself.</returns>
        public static HttpApplication WithCorsEnabled(
            this HttpApplication application,
            IEnumerable <string> allowedOrigins = null,
            IEnumerable <string> allowedHeaders = null,
            IEnumerable <string> exposedHeaders = null)
        {
            if (application == null)
            {
                throw new ArgumentNullException("application");
            }

            var handler = new CorsPostRequestHandler(
                allowedOrigins ?? CorsPostRequestHandler.WithAny,
                allowedHeaders ?? CorsPostRequestHandler.WithAny,
                exposedHeaders ?? CorsPostRequestHandler.WithAny);
            var container = UrsaConfigurationSection.InitializeComponentProvider();

            container.Register <IPostRequestHandler>("CORS", handler);
            return(application);
        }
示例#8
0
        private static void Process(string uri, string targetDirectory)
        {
            HttpUrl url;

            if (uri == null)
            {
                throw new ArgumentNullException("uri");
            }

            if (uri.Length == 0)
            {
                throw new ArgumentOutOfRangeException("uri");
            }

            if (targetDirectory == null)
            {
                throw new ArgumentNullException("targetDirectory");
            }

            if (targetDirectory.Length == 0)
            {
                throw new ArgumentOutOfRangeException("targetDirectory");
            }

            url = UrlParser.Parse(uri) as HttpUrl;
            if (url == null)
            {
                throw new ArgumentOutOfRangeException("uri");
            }

            if (!Directory.Exists(targetDirectory))
            {
                throw new ArgumentOutOfRangeException("targetDirectory");
            }

            _container = UrsaConfigurationSection.InitializeComponentProvider();
            CreateProxy(targetDirectory, url);
        }
示例#9
0
        /// <summary>Registers all APIs into the ASP.net pipeline.</summary>
        /// <param name="application">The application to work with.</param>
        public static IAppBuilder RegisterApis(this IAppBuilder application)
        {
            if (application == null)
            {
                throw new ArgumentNullException("application");
            }

            lock (Lock)
            {
                var container = UrsaConfigurationSection.InitializeComponentProvider();
                container.Register <IHttpServerConfiguration>(new LazyHttpServerConfiguration());
                container.WithAutodiscoveredControllers();
                var namedGraphSelector = container.Resolve <INamedGraphSelector>() as ILocallyControlledNamedGraphSelector;
                if (namedGraphSelector != null)
                {
                    namedGraphSelector.CurrentRequest = () => System.Runtime.Remoting.Messaging.CallContext.HostContext as IRequestInfo;
                }

                application.Use(typeof(UrsaHandler), container.Resolve <IRequestHandler <RequestInfo, ResponseInfo> >());
            }

            return(application);
        }
示例#10
0
        /// <inheritdoc />
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            UrlParser.Register <HttpUrlParser>();
            UrlParser.Register <FtpUrlParser>();
            WindsorComponentProvider componentProvider = container.Resolve <WindsorComponentProvider>();
            var  configuration      = (HttpConfigurationSection)ConfigurationManager.GetSection(HttpConfigurationSection.ConfigurationSection);
            Type sourceSelectorType = ((configuration != null) && (configuration.DefaultValueRelationSelectorType != null) ?
                                       configuration.DefaultValueRelationSelectorType :
                                       typeof(DefaultValueRelationSelector));

            container.AddFacility <TypedFactoryFacility>();
            var typedFactory = new UrsaCustomTypedFactory();

            container.Register(Component.For <IControllerActivator>().UsingFactoryMethod((kernel, context) => new DefaultControllerActivator(UrsaConfigurationSection.InitializeComponentProvider())).LifestyleSingleton());
            container.Register(Component.For <ITripleStore>().Instance(_tripleStore.Value).Named("InMemoryTripleStore").LifestyleSingleton());
            container.Register(Component.For <INamedGraphSelectorFactory>().AsFactory(typedFactory).LifestyleSingleton());
            container.Register(Component.For <INamedGraphSelector>().ImplementedBy <LocallyControlledOwningResourceNamedGraphSelector>()
                               .Forward <ILocallyControlledNamedGraphSelector>().Named("InMemoryNamedGraphSelector").LifestyleSingleton()
                               .PropertiesIgnore((model, property) => property == typeof(LocallyControlledOwningResourceNamedGraphSelector).GetProperty("CurrentRequest")));
            container.Register(Component.For <IEntityContextFactory>().Instance(_entityContextFactory.Value).Named("InMemoryEntityContextFactory").LifestyleSingleton());
            container.Register(Component.For <IEntityContext>().UsingFactoryMethod(CreateEntityContext).Named("InMemoryEntityContext").LifeStyle.HybridPerWebRequestPerThread());
            container.Register(Component.For <IEntityContextProvider>().AsFactory(typedFactory).LifestyleSingleton());
            container.Register(Component.For <IDefaultValueRelationSelector>().ImplementedBy(sourceSelectorType).LifestyleSingleton());
            container.Register(Component.For(typeof(DescriptionController <>)).Forward <IController>()
                               .ImplementedBy(typeof(DescriptionController <>), componentProvider.GenericImplementationMatchingStrategy).LifestyleTransient());
            container.Register(Component.For <EntryPointDescriptionController>().Forward <IController>().ImplementedBy <EntryPointDescriptionController>().LifestyleTransient());
            container.Register(Component.For <IParameterSourceArgumentBinder>().ImplementedBy <FromQueryStringArgumentBinder>().Activator <NonPublicComponentActivator>().LifestyleSingleton());
            container.Register(Component.For <IParameterSourceArgumentBinder>().ImplementedBy <FromUrlArgumentBinder>().Activator <NonPublicComponentActivator>().LifestyleSingleton());
            container.Register(Component.For <IParameterSourceArgumentBinder>().ImplementedBy <FromBodyArgumentBinder>().Activator <NonPublicComponentActivator>().LifestyleSingleton());
            container.Register(Component.For <IClassGenerator>().ImplementedBy <HydraClassGenerator>().LifestyleSingleton());
            container.Register(Component.For <IUriParser>().ImplementedBy <Web.Http.Description.CodeGen.GenericUriParser>().LifestyleSingleton());
            container.Register(Component.For <IUriParser>().ImplementedBy <HydraUriParser>().LifestyleSingleton().Named(typeof(HydraUriParser).FullName));
            container.Register(Component.For <IUriParser>().ImplementedBy <XsdUriParser>().LifestyleSingleton().Named(typeof(XsdUriParser).FullName));
            container.Register(Component.For <IUriParser>().ImplementedBy <OGuidUriParser>().LifestyleSingleton().Named(typeof(OGuidUriParser).FullName));
            container.Register(Component.For <IXmlDocProvider>().ImplementedBy <XmlDocProvider>().LifestyleSingleton());
            container.Register(Component.For <IWebRequestProvider>().ImplementedBy <WebRequestProvider>().LifestyleSingleton());
            container.Register(Component.For <IRequestHandler <RequestInfo, ResponseInfo> >().ImplementedBy <RequestHandler>().LifestyleSingleton());
            container.Register(Component.For <IResponseComposer>().ImplementedBy <ResponseComposer>().LifestyleSingleton());
            container.Register(Component.For <IDelegateMapper <RequestInfo> >().ImplementedBy <DelegateMapper>().LifestyleSingleton());
            container.Register(Component.For <IArgumentBinder <RequestInfo> >().ImplementedBy <ArgumentBinder>().LifestyleSingleton());
            container.Register(Component.For <IResultBinder <RequestInfo> >().ImplementedBy <ResultBinder>().LifestyleSingleton());
            container.Register(Component.For <ITypeDescriptionBuilder>().ImplementedBy <HydraCompliantTypeDescriptionBuilder>()
                               .Named(EntityConverter.Hydra.ToString()).IsDefault().LifestyleSingleton());
            container.Register(Component.For <IServerBehaviorAttributeVisitor>().ImplementedBy <DescriptionBuildingServerBahaviorAttributeVisitor <ParameterInfo> >().Named("Hydra"));
            container.Register(Component.For(typeof(IApiDescriptionBuilder <>)).ImplementedBy(typeof(ApiDescriptionBuilder <>)).LifestyleSingleton().Forward <IApiDescriptionBuilder>());
            container.Register(Component.For <IApiEntryPointDescriptionBuilder>().ImplementedBy <ApiEntryPointDescriptionBuilder>().LifestyleSingleton().Forward <IApiDescriptionBuilder>());
            container.Register(Component.For <IApiDescriptionBuilderFactory>().AsFactory(typedFactory).LifestyleSingleton());
            container.Register(Component.For <IModelTransformer>().ImplementedBy <CollectionModelTransformer>().LifestyleSingleton());
        }