public void Configuration(IAppBuilder app) { var loggerFactory = Settings.Current.GetLoggerFactory(); var logger = loggerFactory.CreateLogger("AppBuilder"); ConfigureAuth(app); var container = CreateContainer(loggerFactory, logger); GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); var resolver = new SimpleInjectorSignalRDependencyResolver(container); if (Settings.Current.EnableRedis) { resolver.UseRedis(new RedisScaleoutConfiguration(Settings.Current.RedisConnectionString, "sample.signalr")); } app.MapSignalR(new HubConfiguration { Resolver = resolver, EnableDetailedErrors = true }); VerifyContainer(container); app.UseWebApi(GlobalConfiguration.Configuration); RunJobs(loggerFactory); }
public void RegisterServices(Container container) { container.Register<IUserIdProvider, PrincipalUserIdProvider>(); container.Register<MessageBusConnection>(); container.RegisterSingleton<ConnectionMapping>(); container.RegisterSingleton<MessageBusBroker>(); var resolver = new SimpleInjectorSignalRDependencyResolver(container); container.RegisterSingleton<IDependencyResolver>(resolver); container.RegisterSingleton<IConnectionManager>(() => new ConnectionManager(resolver)); container.RegisterSingleton<OverageHandler>(); container.RegisterSingleton<ThrottlingHandler>(() => new ThrottlingHandler(container.GetInstance<ICacheClient>(), userIdentifier => Settings.Current.ApiThrottleLimit, TimeSpan.FromMinutes(15))); }
public void RegisterServices(Container container) { container.Register <IUserIdProvider, PrincipalUserIdProvider>(); container.Register <MessageBusConnection>(); container.RegisterSingleton <ConnectionMapping>(); container.RegisterSingleton <MessageBusBroker>(); var resolver = new SimpleInjectorSignalRDependencyResolver(container); container.RegisterSingleton <IDependencyResolver>(resolver); container.RegisterSingleton <IConnectionManager>(() => new ConnectionManager(resolver)); container.RegisterSingleton <OverageHandler>(); container.RegisterSingleton <ThrottlingHandler>(() => new ThrottlingHandler(container.GetInstance <ICacheClient>(), userIdentifier => Settings.Current.ApiThrottleLimit, TimeSpan.FromMinutes(15))); }
public static void RegisterServices(Container container, ILoggerFactory loggerFactory, CancellationToken shutdownCancellationToken) { container.Register <IUserIdProvider, PrincipalUserIdProvider>(); container.Register <MessageBusConnection>(); container.RegisterSingleton <IConnectionMapping, ConnectionMapping>(); container.RegisterSingleton <MessageBusBroker>(); var resolver = new SimpleInjectorSignalRDependencyResolver(container); container.RegisterSingleton <IDependencyResolver>(resolver); container.RegisterSingleton <IConnectionManager>(() => new ConnectionManager(resolver)); container.RegisterSingleton <OverageHandler>(); container.RegisterSingleton <ThrottlingHandler>(() => new ThrottlingHandler(container.GetInstance <ICacheClient>(), container.GetInstance <IMetricsClient>(), userIdentifier => Settings.Current.ApiThrottleLimit, TimeSpan.FromMinutes(15))); container.AppendToCollection(typeof(Profile), typeof(ApiMappings)); }
public static void BuildWithContainer(IAppBuilder app, Container container) { if (container == null) { throw new ArgumentNullException("container"); } Config = new HttpConfiguration(); ExceptionlessClient.Default.RegisterWebApi(Config); Log.Info().Message("Starting api...").Write(); // if enabled, auto upgrade the database if (Settings.Current.ShouldAutoUpgradeDatabase) { var url = new MongoUrl(Settings.Current.MongoConnectionString); string databaseName = url.DatabaseName; if (Settings.Current.AppendMachineNameToDatabase) { databaseName += String.Concat("-", Environment.MachineName.ToLower()); } MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, databaseName); } Config.Services.Add(typeof(IExceptionLogger), new NLogExceptionLogger()); Config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); Config.Formatters.Remove(Config.Formatters.XmlFormatter); Config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented; Config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new LowerCaseUnderscorePropertyNamesContractResolver(); var constraintResolver = new DefaultInlineConstraintResolver(); constraintResolver.ConstraintMap.Add("objectid", typeof(ObjectIdRouteConstraint)); constraintResolver.ConstraintMap.Add("objectids", typeof(ObjectIdsRouteConstraint)); constraintResolver.ConstraintMap.Add("token", typeof(TokenRouteConstraint)); constraintResolver.ConstraintMap.Add("tokens", typeof(TokensRouteConstraint)); Config.MapHttpAttributeRoutes(constraintResolver); //Config.EnableSystemDiagnosticsTracing(); container.RegisterSingle <JsonSerializer>(JsonSerializer.Create(new JsonSerializerSettings { ContractResolver = new SignalRContractResolver() })); container.RegisterWebApiFilterProvider(Config); try { container.Verify(); } catch (Exception ex) { var tempEx = ex; while (!(tempEx is ReflectionTypeLoadException)) { if (tempEx.InnerException == null) { break; } tempEx = tempEx.InnerException; } var typeLoadException = tempEx as ReflectionTypeLoadException; if (typeLoadException != null) { foreach (var loaderEx in typeLoadException.LoaderExceptions) { Debug.WriteLine(loaderEx.Message); } } Debug.WriteLine(ex.Message); throw; } Config.MessageHandlers.Add(container.GetInstance <XHttpMethodOverrideDelegatingHandler>()); Config.MessageHandlers.Add(container.GetInstance <EncodingDelegatingHandler>()); Config.MessageHandlers.Add(container.GetInstance <AuthMessageHandler>()); // Throttle api calls to X every 15 minutes by IP address. Config.MessageHandlers.Add(container.GetInstance <ThrottlingHandler>()); // Reject event posts in orgs over their max event limits. Config.MessageHandlers.Add(container.GetInstance <OverageHandler>()); app.UseCors(new CorsOptions { PolicyProvider = new CorsPolicyProvider { PolicyResolver = ctx => Task.FromResult(new CorsPolicy { AllowAnyHeader = true, AllowAnyMethod = true, AllowAnyOrigin = true, SupportsCredentials = true, PreflightMaxAge = 60 * 5 }) } }); app.CreatePerContext <Lazy <User> >("User", ctx => new Lazy <User>(() => { if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated) { return(null); } string userId = ctx.Request.User.GetUserId(); if (String.IsNullOrEmpty(userId)) { return(null); } var userRepository = container.GetInstance <IUserRepository>(); return(userRepository.GetById(userId, true)); })); app.CreatePerContext <Lazy <Project> >("DefaultProject", ctx => new Lazy <Project>(() => { if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated) { return(null); } // TODO: Use project id from url. E.G., /projects/{projectId:objectid}/events string projectId = ctx.Request.User.GetDefaultProjectId(); var projectRepository = container.GetInstance <IProjectRepository>(); if (String.IsNullOrEmpty(projectId)) { var firstOrgId = ctx.Request.User.GetOrganizationIds().FirstOrDefault(); if (!String.IsNullOrEmpty(firstOrgId)) { var project = projectRepository.GetByOrganizationId(firstOrgId, useCache: true).FirstOrDefault(); if (project != null) { return(project); } } if (Settings.Current.WebsiteMode == WebsiteMode.Dev) { var dataHelper = container.GetInstance <DataHelper>(); // create a default org and project projectId = dataHelper.CreateDefaultOrganizationAndProject(ctx.Request.GetUser()); } } if (String.IsNullOrEmpty(projectId)) { return(null); } return(projectRepository.GetById(projectId, true)); })); app.UseWebApi(Config); var resolver = new SimpleInjectorSignalRDependencyResolver(container); if (Settings.Current.EnableRedis) { resolver.UseRedis(new RedisScaleoutConfiguration(Settings.Current.RedisConnectionString, "exceptionless.signalr")); } app.MapSignalR("/api/v2/push", new HubConfiguration { Resolver = resolver }); Mapper.Configuration.ConstructServicesUsing(container.GetInstance); var context = new OwinContext(app.Properties); var token = context.Get <CancellationToken>("host.OnAppDisposing"); CreateSampleData(container); if (Settings.Current.RunJobsInProcess) { Task.Factory.StartNew(() => container.GetInstance <EventPostsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <EventUserDescriptionsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <MailMessageJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <EventNotificationsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <WebHooksJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); //Task.Factory.StartNew(() => container.GetInstance<DailySummaryJob>().RunContinuousAsync(delay: TimeSpan.FromMinutes(15), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); //Task.Factory.StartNew(() => container.GetInstance<RetentionLimitsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); //Task.Factory.StartNew(() => container.GetInstance<StaleAccountsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); } }
public void Configuration(IAppBuilder app) { var container = new Container(); var httpConfig = new HttpConfiguration(); var signalrResolver = new SimpleInjectorSignalRDependencyResolver(container); container.RegisterContainer(httpConfig, app.GetDataProtectionProvider); // cross owin and simple injector for OnValidateIdentity app.CreatePerOwinContext(container.GetInstance <ApplicationUserManager>); // Enable the application to use a cookie to store information for the signed in user // and to use a cookie to temporarily store information about a user logging in with a third party login provider // Configure the sign in cookie app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login"), Provider = new CookieAuthenticationProvider { // Enables the application to validate the security stamp when the user logs in. // This is a security feature which is used when you change a password or add an external login to your account. OnValidateIdentity = SecurityStampValidator.OnValidateIdentity <ApplicationUserManager, User>( validateInterval: TimeSpan.FromMinutes(5), regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) } }); app.MapScopableHubConnection(async(request, connectionId, next) => { using (AsyncScopedLifestyle.BeginScope(container)) { if (container.GetInstance <IHubRequestAccessor>() is HubRequestAccessor hubRequestAccessor) { hubRequestAccessor.Request = request; } if (container.GetInstance <IHubConnectionIdAccessor>() is HubConnectionIdAccessor hubConnectionIdAccessor) { hubConnectionIdAccessor.ConnectionId = connectionId; } await next(); } }, resolver: signalrResolver); app.Use(async(context, next) => { // check if there is a HttpContext for WebRequestLifestyle to store its scope if (HttpContext.Current != null) { // capture the owin context for any service dependant on it and store it in the async scoped container // this will use WebRequestLifestyle's cache if (container.GetInstance <IOwinContextAccessor>() is OwinContextAccessor webrequestCallContextOwinContextAccessor) { webrequestCallContextOwinContextAccessor.CurrentContext = context; } } using (AsyncScopedLifestyle.BeginScope(container)) { // capture the owin context for any service dependant on it and store it in the async scoped container // this will use AsyncScopedLifestyle's cache if (container.GetInstance <IOwinContextAccessor>() is OwinContextAccessor asyncCallContextOwinContextAccessor) { asyncCallContextOwinContextAccessor.CurrentContext = context; } await next(); } }); app.UseWebApi(httpConfig); AttackProcedures.LoadCovenantOwnersIntoRAM(); DungeonProcedures.GenerateDungeon(); // set chaos mode IPvPWorldStatRepository repo = new EFPvPWorldStatRepository(); var data = repo.PvPWorldStats.FirstOrDefault(); PvPStatics.ChaosMode = data != null ? data.ChaosMode : false; PvPStatics.RoundDuration = data != null ? data.RoundDuration : 5000; TurnTimesStatics.ActiveConfiguration = data != null && TurnTimesStatics.IsValidConfiguration(data.TurnTimeConfiguration) ? data.TurnTimeConfiguration : TurnTimesStatics.FiveMinuteTurns; PvPStatics.AlphaRound = DomainRegistry.Repository.FindSingle(new GetWorld()).RoundNumber ?? PvPStatics.AlphaRound; if (data != null) { JokeShopProcedures.SetJokeShopActive(data.JokeShop); } }
public static void BuildWithContainer(IAppBuilder app, Container container) { if (container == null) { throw new ArgumentNullException("container"); } if (Settings.Current.ShouldAutoUpgradeDatabase) { MongoMigrationChecker.EnsureLatest(Settings.Current.MongoConnectionString, Settings.Current.MongoDatabaseName); } Config = new HttpConfiguration(); Config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); Config.Formatters.Remove(Config.Formatters.XmlFormatter); Config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented; Config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = container.GetInstance <IContractResolver>(); var constraintResolver = new DefaultInlineConstraintResolver(); constraintResolver.ConstraintMap.Add("objectid", typeof(ObjectIdRouteConstraint)); constraintResolver.ConstraintMap.Add("objectids", typeof(ObjectIdsRouteConstraint)); constraintResolver.ConstraintMap.Add("token", typeof(TokenRouteConstraint)); constraintResolver.ConstraintMap.Add("tokens", typeof(TokensRouteConstraint)); Config.MapHttpAttributeRoutes(constraintResolver); container.RegisterWebApiFilterProvider(Config); VerifyContainer(container); container.Bootstrap(Config); container.Bootstrap(app); Log.Info().Message("Starting api...").Write(); Config.Services.Add(typeof(IExceptionLogger), new NLogExceptionLogger()); Config.Services.Replace(typeof(IExceptionHandler), container.GetInstance <ExceptionlessReferenceIdExceptionHandler>()); Config.MessageHandlers.Add(container.GetInstance <XHttpMethodOverrideDelegatingHandler>()); Config.MessageHandlers.Add(container.GetInstance <EncodingDelegatingHandler>()); Config.MessageHandlers.Add(container.GetInstance <AuthMessageHandler>()); // Throttle api calls to X every 15 minutes by IP address. Config.MessageHandlers.Add(container.GetInstance <ThrottlingHandler>()); // Reject event posts in orgs over their max event limits. Config.MessageHandlers.Add(container.GetInstance <OverageHandler>()); app.UseCors(new CorsOptions { PolicyProvider = new CorsPolicyProvider { PolicyResolver = ctx => Task.FromResult(new CorsPolicy { AllowAnyHeader = true, AllowAnyMethod = true, AllowAnyOrigin = true, SupportsCredentials = true, PreflightMaxAge = 60 * 5 }) } }); app.CreatePerContext <Lazy <User> >("User", ctx => new Lazy <User>(() => { if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated) { return(null); } string userId = ctx.Request.User.GetUserId(); if (String.IsNullOrEmpty(userId)) { return(null); } var userRepository = container.GetInstance <IUserRepository>(); return(userRepository.GetById(userId, true)); })); app.CreatePerContext <Lazy <Project> >("DefaultProject", ctx => new Lazy <Project>(() => { if (ctx.Request.User == null || ctx.Request.User.Identity == null || !ctx.Request.User.Identity.IsAuthenticated) { return(null); } // TODO: Use project id from url. E.G., /projects/{projectId:objectid}/events string projectId = ctx.Request.User.GetDefaultProjectId(); var projectRepository = container.GetInstance <IProjectRepository>(); if (String.IsNullOrEmpty(projectId)) { var firstOrgId = ctx.Request.User.GetOrganizationIds().FirstOrDefault(); if (!String.IsNullOrEmpty(firstOrgId)) { var project = projectRepository.GetByOrganizationId(firstOrgId, useCache: true).FirstOrDefault(); if (project != null) { return(project); } } if (Settings.Current.WebsiteMode == WebsiteMode.Dev) { var dataHelper = container.GetInstance <DataHelper>(); // create a default org and project projectId = dataHelper.CreateDefaultOrganizationAndProject(ctx.Request.GetUser()); } } if (String.IsNullOrEmpty(projectId)) { return(null); } return(projectRepository.GetById(projectId, true)); })); app.UseWebApi(Config); var resolver = new SimpleInjectorSignalRDependencyResolver(container); if (Settings.Current.EnableRedis) { resolver.UseRedis(new RedisScaleoutConfiguration(Settings.Current.RedisConnectionString, "exceptionless.signalr")); } app.MapSignalR("/api/v2/push", new HubConfiguration { Resolver = resolver }); Config.EnableSwagger("schema/{apiVersion}", c => { c.SingleApiVersion("v2", "Exceptionless"); c.ApiKey("access_token").In("header").Name("access_token").Description("API Key Authentication"); c.BasicAuth("basic").Description("Basic HTTP Authentication"); c.IncludeXmlComments(String.Format(@"{0}\bin\Exceptionless.Api.xml", AppDomain.CurrentDomain.BaseDirectory)); c.IgnoreObsoleteActions(); c.DocumentFilter <FilterRoutesDocumentFilter>(); }).EnableSwaggerUi("docs/{*assetPath}", c => { c.InjectStylesheet(typeof(AppBuilder).Assembly, "Exceptionless.Api.Content.docs.css"); c.InjectJavaScript(typeof(AppBuilder).Assembly, "Exceptionless.Api.Content.docs.js"); }); Mapper.Configuration.ConstructServicesUsing(container.GetInstance); var context = new OwinContext(app.Properties); var token = context.Get <CancellationToken>("host.OnAppDisposing"); CreateSampleData(container); if (Settings.Current.RunJobsInProcess) { Task.Factory.StartNew(() => container.GetInstance <EventPostsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <EventUserDescriptionsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <MailMessageJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <EventNotificationsJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); Task.Factory.StartNew(() => container.GetInstance <WebHooksJob>().RunContinuousAsync(token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); //Task.Factory.StartNew(() => container.GetInstance<DailySummaryJob>().RunContinuousAsync(delay: TimeSpan.FromMinutes(15), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); //Task.Factory.StartNew(() => container.GetInstance<RetentionLimitsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); //Task.Factory.StartNew(() => container.GetInstance<StaleAccountsJob>().RunContinuousAsync(delay: TimeSpan.FromHours(8), token: token), token, TaskCreationOptions.LongRunning, TaskScheduler.Default).IgnoreExceptions(); } }
public void Configuration(IAppBuilder app) { //Repository to consider const string DB_REPOSITORY_NAMESPACE = "TodoApp.Infrastructure.InMemory.Repositories"; //DI container var container = new Container(); //Registering all controllers container.RegisterWebApiControllers(GlobalConfiguration.Configuration); //Getting Application assembly var applicationAssembly = typeof(TodoApp.Application.ApplicationException).Assembly; //Registering Application interfaces var registrations = from type in applicationAssembly.GetExportedTypes() where type.GetInterfaces().Any() && !type.Name.Contains("Exception") select new { Service = type.GetInterfaces().Single(), Implementation = type }; foreach (var reg in registrations) { container.Register(reg.Service, reg.Implementation, Lifestyle.Transient); } //Getting Repository assembly var repositoryAssembly = typeof(TodoApp.Infrastructure.ReferenceType).Assembly; //Registering Repository interfaces registrations = from type in repositoryAssembly.GetExportedTypes() where type.Namespace == DB_REPOSITORY_NAMESPACE where type.GetInterfaces().Any() select new { Service = type.GetInterfaces().Single(), Implementation = type }; foreach (var reg in registrations) { container.Register(reg.Service, reg.Implementation, Lifestyle.Transient); } //Registeging InMemoryDB container.Register(() => new TodoApp.Infrastructure.InMemory.Context(), Lifestyle.Singleton); app.Use(async(context, next) => { using (AsyncScopedLifestyle.BeginScope(container)) { await next(); } }); GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); //Registering SignalR socket service var signalRResolver = new SimpleInjectorSignalRDependencyResolver(container); IJokeFetcher jokeFetcher = new JokeFetcher(); container.Register(() => new TodoAppHub(jokeFetcher), Lifestyle.Singleton); app.Map("/r", map => { map.UseCors(CorsOptions.AllowAll); var hubConfiguration = new HubConfiguration { Resolver = signalRResolver }; map.RunSignalR(hubConfiguration); }); GlobalHost.DependencyResolver = signalRResolver; //Configuring cors app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); }