public static void BuildWithContainer(IAppBuilder app, Container container) { if (container == null) throw new ArgumentNullException(nameof(container)); Config = new HttpConfiguration(); Config.Formatters.Remove(Config.Formatters.XmlFormatter); Config.Formatters.JsonFormatter.SerializerSettings.Formatting = Formatting.Indented; SetupRouteConstraints(Config); container.RegisterWebApiControllers(Config); VerifyContainer(container); Config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container); var contractResolver = container.GetInstance<IContractResolver>(); var exceptionlessContractResolver = contractResolver as ExceptionlessContractResolver; exceptionlessContractResolver?.UseDefaultResolverFor(typeof(Connection).Assembly); Config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = contractResolver; 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>()); EnableCors(Config, app); container.Bootstrap(Config); container.Bootstrap(app); 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 }); SetupSwagger(Config); Mapper.Configuration.ConstructServicesUsing(container.GetInstance); if (Settings.Current.WebsiteMode == WebsiteMode.Dev) Task.Run(async () => await CreateSampleDataAsync(container)); if (Settings.Current.RunJobsInProcess) { Log.Warn().Message("Jobs running in process.").Write(); var context = new OwinContext(app.Properties); var token = context.Get<CancellationToken>("host.OnAppDisposing"); JobRunner.RunContinuousAsync<EventPostsJob>(cancellationToken: token); JobRunner.RunContinuousAsync<EventUserDescriptionsJob>(cancellationToken: token); JobRunner.RunContinuousAsync<MailMessageJob>(cancellationToken: token); JobRunner.RunContinuousAsync<EventNotificationsJob>(cancellationToken: token); JobRunner.RunContinuousAsync<WebHooksJob>(cancellationToken: token); JobRunner.RunContinuousAsync<DailySummaryJob>(cancellationToken: token, interval: TimeSpan.FromHours(1)); JobRunner.RunContinuousAsync<DownloadGeoIPDatabaseJob>(cancellationToken: token, interval: TimeSpan.FromDays(1)); JobRunner.RunContinuousAsync<RetentionLimitsJob>(cancellationToken: token, interval: TimeSpan.FromDays(1)); JobRunner.RunContinuousAsync<WorkItemJob>(instanceCount: 2, cancellationToken: token); } else { Log.Info().Message("Jobs running out of process.").Write(); } Log.Info().Message("Starting api...").Write(); }
public static void BuildWithContainer(IAppBuilder app, Container container) { if (container == null) throw new ArgumentNullException("container"); var contractResolver = container.GetInstance<IContractResolver>(); var exceptionlessContractResolver = contractResolver as ExceptionlessContractResolver; if (exceptionlessContractResolver != null) exceptionlessContractResolver.UseDefaultResolverFor(typeof(Connection).Assembly); 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 = contractResolver; SetupRouteConstraints(Config); 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).Documents.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 }); SetupSwagger(Config); Mapper.Configuration.ConstructServicesUsing(container.GetInstance); CreateSampleData(container); if (Settings.Current.RunJobsInProcess) { Log.Warn().Message("Jobs running in process.").Write(); var context = new OwinContext(app.Properties); var token = context.Get<CancellationToken>("host.OnAppDisposing"); JobRunner.RunContinuousAsync<EventPostsJob>(cancellationToken: token); JobRunner.RunContinuousAsync<EventUserDescriptionsJob>(cancellationToken: token); JobRunner.RunContinuousAsync<MailMessageJob>(cancellationToken: token); JobRunner.RunContinuousAsync<EventNotificationsJob>(cancellationToken: token); JobRunner.RunContinuousAsync<WebHooksJob>(cancellationToken: token); JobRunner.RunContinuousAsync<DailySummaryJob>(cancellationToken: token, interval: TimeSpan.FromHours(1)); JobRunner.RunContinuousAsync<DownloadGeoIPDatabaseJob>(cancellationToken: token, interval: TimeSpan.FromDays(1)); JobRunner.RunContinuousAsync<RetentionLimitsJob>(cancellationToken: token, interval: TimeSpan.FromDays(1)); JobRunner.RunContinuousAsync<WorkItemJob>(instanceCount: 2, cancellationToken: token); } else { Log.Info().Message("Jobs running out of process.").Write(); } }