| File: Internal\DataProtectionHostedService.cs | Web Access |
| Project: src\aspnetcore\src\DataProtection\DataProtection\src\Microsoft.AspNetCore.DataProtection.csproj (Microsoft.AspNetCore.DataProtection) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.DataProtection.KeyManagement.Internal; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; namespace Microsoft.AspNetCore.DataProtection.Internal; internal sealed class DataProtectionHostedService : IHostedService { private readonly IKeyRingProvider _keyRingProvider; private readonly ILogger<DataProtectionHostedService> _logger; public DataProtectionHostedService(IKeyRingProvider keyRingProvider) : this(keyRingProvider, NullLoggerFactory.Instance) { } public DataProtectionHostedService(IKeyRingProvider keyRingProvider, ILoggerFactory loggerFactory) { _keyRingProvider = keyRingProvider; _logger = loggerFactory.CreateLogger<DataProtectionHostedService>(); } public Task StartAsync(CancellationToken token) { try { // It doesn't look like much, but this preloads the key ring, // which in turn may load data from remote stores like Redis or Azure. var keyRing = _keyRingProvider.GetCurrentKeyRing(); _logger.KeyRingWasLoadedOnStartup(keyRing.DefaultKeyId); } catch (Exception ex) { // This should be non-fatal, so swallow, log, and allow server startup to continue. // The KeyRingProvider may be able to try again on the first request. _logger.KeyRingFailedToLoadOnStartup(ex); } return Task.CompletedTask; } public Task StopAsync(CancellationToken token) => Task.CompletedTask; }