1111using System . Net . Http ;
1212using System . Net . Mail ;
1313using System . Security . Principal ;
14- using System . Threading ;
1514using System . Threading . Tasks ;
1615using System . Web ;
1716using System . Web . Hosting ;
2322using Elmah ;
2423using Microsoft . ApplicationInsights . Extensibility ;
2524using Microsoft . ApplicationInsights . Extensibility . Implementation ;
25+ using Microsoft . AspNet . TelemetryCorrelation ;
2626using Microsoft . Extensions . DependencyInjection ;
2727using Microsoft . Extensions . Http ;
2828using Microsoft . Extensions . Logging ;
2929using Microsoft . WindowsAzure . ServiceRuntime ;
30+ using Microsoft . WindowsAzure . Storage ;
3031using NuGet . Services . Entities ;
3132using NuGet . Services . FeatureFlags ;
3233using NuGet . Services . KeyVault ;
@@ -1389,19 +1390,25 @@ private static IAuditingService CombineAuditingServices(IEnumerable<IAuditingSer
13891390 return new AggregateAuditingService ( services ) ;
13901391 }
13911392
1392- private static IEnumerable < T > GetAddInServices < T > ( ContainerBuilder builder )
1393+ private static IEnumerable < T > GetAddInServices < T > ( )
1394+ {
1395+ return GetAddInServices < T > ( sp => { } ) ;
1396+ }
1397+
1398+ private static IEnumerable < T > GetAddInServices < T > ( Action < RuntimeServiceProvider > populateProvider )
13931399 {
13941400 var addInsDirectoryPath = Path . Combine ( AppDomain . CurrentDomain . BaseDirectory , "bin" , "add-ins" ) ;
13951401
13961402 using ( var serviceProvider = RuntimeServiceProvider . Create ( addInsDirectoryPath ) )
13971403 {
1404+ populateProvider ( serviceProvider ) ;
13981405 return serviceProvider . GetExportedValues < T > ( ) ;
13991406 }
14001407 }
14011408
14021409 private static void RegisterAuditingServices ( ContainerBuilder builder , IAuditingService defaultAuditingService )
14031410 {
1404- var auditingServices = GetAddInServices < IAuditingService > ( builder ) ;
1411+ var auditingServices = GetAddInServices < IAuditingService > ( ) ;
14051412 var services = new List < IAuditingService > ( auditingServices ) ;
14061413
14071414 if ( defaultAuditingService != null )
@@ -1419,26 +1426,27 @@ private static void RegisterAuditingServices(ContainerBuilder builder, IAuditing
14191426
14201427 private static void RegisterCookieComplianceService ( ContainerBuilder builder , ConfigurationService configuration , DiagnosticsService diagnostics )
14211428 {
1422- var service = GetAddInServices < ICookieComplianceService > ( builder ) . FirstOrDefault ( ) as CookieComplianceServiceBase ;
1423-
1424- if ( service == null )
1429+ CookieComplianceServiceBase service = null ;
1430+ if ( configuration . Current . IsHosted )
14251431 {
1426- service = new NullCookieComplianceService ( ) ;
1432+ var siteName = configuration . GetSiteRoot ( true ) ;
1433+ service = GetAddInServices < ICookieComplianceService > ( sp =>
1434+ {
1435+ sp . ComposeExportedValue ( "Domain" , siteName ) ;
1436+ sp . ComposeExportedValue < IDiagnosticsService > ( diagnostics ) ;
1437+ } ) . FirstOrDefault ( ) as CookieComplianceServiceBase ;
1438+
1439+ if ( service != null )
1440+ {
1441+ // Initialize the service on App_Start to avoid any performance degradation during initial requests.
1442+ HostingEnvironment . QueueBackgroundWorkItem ( async cancellationToken => await service . InitializeAsync ( siteName , diagnostics , cancellationToken ) ) ;
1443+ }
14271444 }
14281445
1429- builder . RegisterInstance ( service )
1446+ builder . RegisterInstance ( service ?? new NullCookieComplianceService ( ) )
14301447 . AsSelf ( )
14311448 . As < ICookieComplianceService > ( )
14321449 . SingleInstance ( ) ;
1433-
1434- if ( configuration . Current . IsHosted )
1435- {
1436- var siteName = configuration . GetSiteRoot ( true ) ;
1437-
1438- // We must initialize during app start so that the cookie compliance service is ready when the first
1439- // request comes in.
1440- service . InitializeAsync ( siteName , diagnostics , CancellationToken . None ) . Wait ( ) ;
1441- }
14421450 }
14431451 }
14441452}
0 commit comments