{"id":301572,"date":"2020-04-09T15:00:24","date_gmt":"2020-04-09T15:00:24","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=301572"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2020-04-09T15:00:24","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=301572","title":{"rendered":"\u0410\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 Startup ASP.NET Core: 4 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u043e\u0431\u0445\u043e\u0434\u0430 GetAwaiter().GetResult()"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/496300\/\">\u0421 \u0442\u0435\u0445 \u043f\u043e\u0440, \u043a\u0430\u043a \u0432 C# 5.0 \u0437\u0430\u0432\u0435\u0437\u043b\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c async\/await, \u043d\u0430\u0441 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u0438 \u0434\u043e\u043a\u0430\u0445 \u0443\u0447\u0430\u0442, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e. \u0418 \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u044e\u0442 \u0431\u043e\u044f\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043e\u0433\u043d\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 GetAwaiter().GetResult(). \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0441\u0430\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b Microsoft \u043d\u0435 \u0433\u043d\u0443\u0448\u0430\u044e\u0442\u0441\u044f \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yl\/m9\/nb\/ylm9nbu--2sz9pzjxu-tgx8k5t4.png\"><br \/>   <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u041f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443<\/h2>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0441\u043e \u0441\u0442\u0430\u0440\u043e\u0439 \u043b\u0435\u0433\u0430\u0441\u0438-\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430 OAuth 2.0, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0432 \u043d\u0430\u0448\u0435\u0439 \u043e\u0442\u0440\u0430\u0441\u043b\u0438. \u0421\u0435\u0440\u0432\u0438\u0441, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u044e, \u0441\u0442\u0430\u043b \u043f\u0438\u043b\u043e\u0442\u043e\u043c \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u043d\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 JWT-\u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e.<\/p>\n<p>  \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u043a\u0430\u043a \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043d\u0430 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 (IdentityServer \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435) \u0438 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 JWT \u0432 ASP.NET Core \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0438 \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0442\u043e\u043a\u0435\u043d\u043e\u0432: <\/p>\n<pre><code class=\"cs\">services       .AddAuthentication()       .AddJwtBearer();  <\/code><\/pre>\n<p>  \u041d\u043e \u0447\u0442\u043e \u0441\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u044d\u0442\u0438\u043c\u0438 \u0434\u0432\u0443\u043c\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430\u043c\u0438? \u041f\u043e\u0434 \u0438\u0445 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f JWTBearerHandler, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u0438 \u0438\u043c\u0435\u0435\u0442 \u0434\u0435\u043b\u043e \u0441 JWT \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 API.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fs\/sx\/ce\/fssxce2duwjnem0_zgekkezhglm.jpeg\" width=\"550\"><\/div>\n<p>  <i>\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, API \u0438 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435<\/i><\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 JWTBearerHandler \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430, \u043e\u043d \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u043d\u0430 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0443, \u0430, \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442, \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0443 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 Signing Key \u2014 \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043a\u043b\u044e\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u0442\u043e\u043a\u0435\u043d. \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430 \u0443\u0431\u0435\u0436\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0442\u043e\u043a\u0435\u043d \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043d\u0443\u0436\u043d\u044b\u043c \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u043c.<\/p>\n<p>  \u0412\u043d\u0443\u0442\u0440\u0438 JWTBearerHandler \u0441\u0438\u0434\u0438\u0442 HttpClient, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u043c \u043f\u043e \u0441\u0435\u0442\u0438. \u041d\u043e, \u0435\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e Signing Key \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 \u043d\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0447\u0430\u0441\u0442\u043e, \u0442\u043e \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0437\u0430\u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0431\u0435 \u0438 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>  \u0422\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f Signing Key \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0443 \u043c\u0435\u043d\u044f:<\/p>\n<pre><code class=\"cs\">public static AuthenticationBuilder AddJwtAuthentication(this AuthenticationBuilder builder, AuthJwtOptions options) {     var signingKeys = new List&lt;SecurityKey&gt;();      var jwtBearerOptions = new JwtBearerOptions {Authority = options?.Authority};          new JwtBearerPostConfigureOptions().PostConfigure(string.Empty, jwtBearerOptions);     try     {         var config = jwtBearerOptions.ConfigurationManager             .GetConfigurationAsync(new CancellationTokenSource(options?.AuthorityTimeoutInMs ?? 5000).Token)             .GetAwaiter().GetResult();         var providerSigningKeys = config.SigningKeys;         signingKeys.AddRange(providerSigningKeys);     }     catch (Exception)     {         \/\/ ignored     }      builder         .AddJwtBearer(options =&gt;         {             options.TokenValidationParameters = new TokenValidationParameters             {                 \/\/ ...                 IssuerSigningKeys = signingKeys,                 \/\/ ...             };         });     return builder; }<\/code><\/pre>\n<p>  \u0412 12 \u0441\u0442\u0440\u043e\u043a\u0435 \u043c\u044b \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u043c .GetAwaiter().GetResult(). \u0412\u0441\u0451 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e AuthenticationBuilder \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 public void ConfigureServices(IServiceCollection services) {&#8230;} \u043a\u043b\u0430\u0441\u0441\u0430 Startup, \u0438 \u043c\u0435\u0442\u043e\u0434 \u044d\u0442\u043e\u0442 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430. \u0411\u0435\u0434\u0430.<\/p>\n<p>  \u041d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 C# 7.1 \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 Main(). \u0410 \u0432\u043e\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Startup \u0432 Asp.NET Core \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435 \u0437\u0430\u0432\u0435\u0437\u043b\u0438. \u041c\u0435\u043d\u044f \u044d\u0441\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u043f\u0440\u044f\u0433\u0430\u043b\u043e \u043f\u0438\u0441\u0430\u0442\u044c GetAwaiter().GetResult() (\u043c\u0435\u043d\u044f \u0436\u0435 \u0443\u0447\u0438\u043b\u0438 \u0442\u0430\u043a \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c!), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u043e\u043b\u0435\u0437 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0438\u0441\u043a\u0430\u0442\u044c, \u043a\u0430\u043a \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441 \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439.<\/p>\n<h2>\u041c\u0435\u043d\u044f \u043d\u0430\u043f\u0440\u044f\u0433\u0430\u0435\u0442 GetAwaiter().GetResult(), \u0430 Microsoft \u2013 \u043d\u0435\u0442<\/h2>\n<p>  \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u0435\u0440\u0432\u044b\u0445 \u044f \u043d\u0430\u0448\u0451\u043b \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b Microsoft \u0432 \u043f\u043e\u0445\u043e\u0436\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 <a href=\"https:\/\/github.com\/aspnet\/Configuration\/blob\/master\/src\/Config.AzureKeyVault\/AzureKeyVaultConfigurationProvider.cs#L46\">\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438\u0437 Azure KeyVault<\/a>. \u0415\u0441\u043b\u0438 \u0441\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0432\u043d\u0438\u0437 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0451\u0432 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438, \u0442\u043e \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c:<\/p>\n<pre><code class=\"cs\">public override void Load() =&gt; LoadAsync().ConfigureAwait(false).GetAwaiter().GetResult();<\/code><\/pre>\n<p>  \u0421\u043d\u043e\u0432\u0430 \u0437\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439, GetAwaiter().GetResult()! \u0410 \u043d\u0435\u0442 \u043b\u0438 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0438\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439? <\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0433\u0443\u0433\u043b\u0435\u043d\u0438\u044f, \u044f \u043d\u0430\u0448\u0451\u043b \u0446\u0435\u043b\u0443\u044e <a href=\"https:\/\/andrewlock.net\/running-async-tasks-on-app-startup-in-asp-net-core-part-1\/\">\u0441\u0435\u0440\u0438\u044e \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439<\/a> \u042d\u043d\u0434\u0440\u044e \u041b\u043e\u043a\u0430 (Andrew Lock), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0434 \u043d\u0430\u0437\u0430\u0434 \u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0441\u044f \u043d\u0430\u0434 \u0442\u0435\u043c \u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u0447\u0442\u043e \u0438 \u044f. \u0414\u0430\u0436\u0435 \u043f\u043e \u0442\u0435\u043c \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u2014 \u0435\u043c\u0443 \u044d\u0441\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434.<\/p>\n<p>  \u0412\u043e\u043e\u0431\u0449\u0435 \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0432\u0441\u0435\u043c, \u043a\u043e\u0433\u043e \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0430 \u044d\u0442\u0430 \u0442\u0435\u043c\u0430, \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0446\u0438\u043a\u043b \u0438\u0437 \u043f\u044f\u0442\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u042d\u043d\u0434\u0440\u044e. \u0422\u0430\u043c \u043e\u043d \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u044f\u0442 \u043a \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435, \u0437\u0430\u0442\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432, \u0430 \u0443\u0436\u0435 \u043f\u043e\u0442\u043e\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u042f \u0432 \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u0443\u044e \u0432\u044b\u0436\u0438\u043c\u043a\u0443 \u0435\u0433\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439, \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0432\u0448\u0438\u0441\u044c \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u0445.<\/p>\n<h2>\u0420\u043e\u043b\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/h2>\n<p>  \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0448\u0430\u0433 \u043d\u0430\u0437\u0430\u0434, \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432\u0441\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u0412 \u0447\u0451\u043c \u043a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0435\u0448\u0438\u0442\u044c, \u0432\u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430?   <\/p>\n<blockquote><p><b>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/b> \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0441\u0432\u043e\u0438\u0445 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0441\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e (\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e) \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0431\u0435\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441 \u043b\u0438\u0431\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043a\u043b\u0438\u0435\u043d\u0442\u0443, \u043b\u0438\u0431\u043e \u0435\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c\u0438.<\/p><\/blockquote>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0442\u0430\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439:<\/p>\n<ul>\n<li>\u0412\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u0433\u043e\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432.<\/li>\n<li>\u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u044d\u0448\u0430.<\/li>\n<li>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414 \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c.<\/li>\n<li>JIT \u0438 \u043f\u043e\u0434\u0433\u0440\u0443\u0437\u043a\u0430 Assembly (\u043f\u0440\u043e\u0433\u0440\u0435\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0430).<\/li>\n<li>\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0411\u0414. \u042d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u042d\u043d\u0434\u0440\u044e \u041b\u043e\u043a\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u043d \u0441\u0430\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u0451\u0442, \u0447\u0442\u043e \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u044d\u0442\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e <a href=\"https:\/\/andrewlock.net\/running-async-tasks-on-app-startup-in-asp-net-core-part-3-feedback\">\u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/a>.<\/li>\n<\/ul>\n<p>  \u0425\u043e\u0447\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u0440\u0438\u0447\u0451\u043c \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0434\u043b\u044f \u043d\u0438\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u0431\u0435\u0437 GetAwaiter().GetResult(). <\/p>\n<p>  \u042d\u0442\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u043d\u0451\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043d\u043e \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u043c \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 DI.<\/p>\n<p>  \u042d\u0442\u0443 \u0438\u0434\u0435\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0441\u0445\u0435\u043c\u044b:  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nc\/eh\/ym\/ncehymvjo0cm3yz5p3uq-uycvpq.jpeg\"><\/div>\n<h2>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u21161: \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432<\/h2>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, <a href=\"https:\/\/andrewlock.net\/running-async-tasks-on-app-startup-in-asp-net-core-part-2\/\">\u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u043e\u0435 \u041b\u043e\u043a\u043e\u043c<\/a>:<\/p>\n<pre><code class=\"cs\">public class Program {    public static async Task Main(string[] args)    {        IWebHost webHost = CreateWebHostBuilder(args).Build();         using (var scope = webHost.Services.CreateScope())        {            \/\/ \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441            var myService = scope.ServiceProvider.GetRequiredService&lt;MyService&gt;();             await myService.DoAsyncJob();        }         await webHost.RunAsync();    }     public static IWebHostBuilder CreateWebHostBuilder(string[] args) =&gt;        WebHost.CreateDefaultBuilder(args)            .UseStartup&lt;Startup&gt;(); }<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441\u0442\u0430\u043b \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e Main() \u0438\u0437 C# 7.1. \u0415\u0433\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0438\u043d\u0443\u0441 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u043b\u0438 \u0438\u0437 Startup.cs \u0432 Program.cs. \u0422\u0430\u043a\u043e\u0435 \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0434\u043b\u044f ASP.NET-\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043d\u0430\u0448 \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043f\u043e \u043d\u0430\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0443.<\/p>\n<h2>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u21162: \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432 DI<\/h2>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u042d\u043d\u0434\u0440\u044e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u041e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447:<\/p>\n<pre><code class=\"cs\">public interface IStartupTask {     Task ExecuteAsync(CancellationToken cancellationToken = default); }<\/code><\/pre>\n<p>  \u0410 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 DI:<\/p>\n<pre><code class=\"cs\">public static class ServiceCollectionExtensions {     public static IServiceCollection AddStartupTask&lt;T&gt;(this IServiceCollection services)         where T : class, IStartupTask         =&gt; services.AddTransient&lt;IStartupTask, T&gt;(); }<\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f, \u0443\u0436\u0435 \u0434\u043b\u044f IWebHost:<\/p>\n<pre><code class=\"cs\">public static class StartupTaskWebHostExtensions {     public static async Task RunWithTasksAsync(this IWebHost webHost, CancellationToken cancellationToken = default)     {         \/\/ \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u0437 DI         var startupTasks = webHost.Services.GetServices&lt;IStartupTask&gt;();          \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u0437\u0430\u0434\u0430\u0447\u0438         foreach (var startupTask in startupTasks)         {             await startupTask.ExecuteAsync(cancellationToken);         }          \/\/ \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e         await webHost.RunAsync(cancellationToken);     } }<\/code><\/pre>\n<p>  \u0418 \u0432 Program.cs \u043c\u044b \u043c\u0435\u043d\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443. \u0412\u043c\u0435\u0441\u0442\u043e:<\/p>\n<pre><code class=\"cs\">await CreateWebHostBuilder(args).Build().Run();<\/code><\/pre>\n<p>  \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c:<\/p>\n<pre><code class=\"cs\">await CreateWebHostBuilder(args).Build().RunWithTasksAsync();<\/code><\/pre>\n<p>  \u041f\u043e-\u043c\u043e\u0435\u043c\u0443, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043b\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h2>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u21163: \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u0435\u0440\u0435\u0448\u0435\u043b \u043d\u0430 ASP.NET Core 3.x<\/h2>\n<p>  \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 ASP.NET Core 3.x, \u0442\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u0432\u0430\u0440\u0438\u0430\u043d\u0442. \u0412\u043d\u043e\u0432\u044c \u0441\u043e\u0448\u043b\u044e\u0441\u044c \u043d\u0430 <a href=\"https:\/\/andrewlock.net\/running-async-tasks-on-app-startup-in-asp-net-core-3\/\">\u0441\u0442\u0430\u0442\u044c\u044e \u042d\u043d\u0434\u0440\u044e \u041b\u043e\u043a\u0430<\/a>. <\/p>\n<p>  \u0412\u043e\u0442 \u043a\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 WebHost \u0438\u0437 ASP.NET Core 2.x:<\/p>\n<pre><code class=\"cs\">public class WebHost {     public virtual async Task StartAsync(CancellationToken cancellationToken = default)     {         \/\/ ... initial setup         await Server.StartAsync(hostingApp, cancellationToken).ConfigureAwait(false);          \/\/ Fire IApplicationLifetime.Started         _applicationLifetime?.NotifyStarted();          \/\/ Fire IHostedService.Start         await _hostedServiceExecutor.StartAsync(cancellationToken).ConfigureAwait(false);          \/\/ ...remaining setup     } }<\/code><\/pre>\n<p>  \u0410 \u0432\u043e\u0442 <a href=\"https:\/\/github.com\/dotnet\/aspnetcore\/blob\/v3.0.0-preview9.19424.4\/src\/Hosting\/Hosting\/src\/Internal\/WebHost.cs#L154\">\u044d\u0442\u043e\u0442 \u0436\u0435 \u043c\u0435\u0442\u043e\u0434<\/a> \u0432 ASP.NET Core 3.0:<\/p>\n<pre><code class=\"cs\">public class WebHost {     public virtual async Task StartAsync(CancellationToken cancellationToken = default)     {         \/\/ ... initial setup          \/\/ Fire IHostedService.Start         await _hostedServiceExecutor.StartAsync(cancellationToken).ConfigureAwait(false);          \/\/ ... more setup         await Server.StartAsync(hostingApp, cancellationToken).ConfigureAwait(false);          \/\/ Fire IApplicationLifetime.Started         _applicationLifetime?.NotifyStarted();          \/\/ ...remaining setup     } }<\/code><\/pre>\n<p>  \u0412 ASP.NET Core 3.x \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f HostedServices \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0442\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 WebHost, \u0430 \u0440\u0430\u043d\u044c\u0448\u0435 \u0431\u044b\u043b\u043e \u0440\u043e\u0432\u043d\u043e \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u0427\u0442\u043e \u043d\u0430\u043c \u044d\u0442\u043e \u0434\u0430\u0451\u0442? \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u0435 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 StartAsync(CancellationToken) \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 IHostedService \u0438 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u0433\u043e \u0436\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0430, \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f.<\/p>\n<h2>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u21164: \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0441 health check \u0438 Kubernetes<\/h2>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0443\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f, \u043d\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u043e\u0434\u0445\u043e\u0434, \u0438 \u043e\u043d \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0430\u0436\u043d\u044b\u043c \u0432 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u044f\u0445. \u042d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 health check.<\/p>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f: \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u043d\u044c\u0448\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 Kestrel, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0443 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u0433\u043e\u0442\u043e\u0432 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u041d\u043e \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 health check, \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c 503 (Service Unavailable). \u041d\u0430 \u0441\u0430\u0439\u0442\u0435 Microsoft \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e <a href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/host-and-deploy\/health-checks?view=aspnetcore-3.1\">\u043e\u0431\u0448\u0438\u0440\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u043f\u0440\u043e \u0442\u043e, \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c health check \u0432 ASP.NET Core. \u042f \u0436\u0435 \u0445\u043e\u0442\u0435\u043b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u044b\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043a \u043d\u0430\u0448\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435.<\/p>\n<p>  \u0423 \u042d\u043d\u0434\u0440\u044e \u041b\u043e\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430 <a href=\"https:\/\/andrewlock.net\/running-async-tasks-on-app-startup-in-asp-net-core-part-4-using-health-checks\/\">\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u043f\u043e\u0434 \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u0435\u0433\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u043e\u0432.   <\/p>\n<blockquote><p>\u0411\u0443\u0434\u0435\u0442 \u043b\u0443\u0447\u0448\u0435, \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u0435\u0440\u043d\u0451\u0442 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441 \u043a\u043e\u0434\u043e\u043c \u043e\u0448\u0438\u0431\u043a\u0438, \u0447\u0435\u043c \u043d\u0435 \u0432\u0435\u0440\u043d\u0451\u0442 \u043d\u0438\u0447\u0435\u0433\u043e, \u043f\u0440\u0438\u0432\u043e\u0434\u044f \u043a \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0443 \u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u044f Kestrel \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u043d\u044c\u0448\u0435, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u043d\u044c\u0448\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u043f\u043e \u0442\u0438\u043f\u0443 \u00ab\u044f \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u00bb.<\/p><\/blockquote>\n<p>  \u041d\u0435 \u0431\u0443\u0434\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u042d\u043d\u0434\u0440\u044e \u041b\u043e\u043a\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u0441 health check. \u041e\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u044a\u0451\u043c\u043d\u043e\u0435, \u043d\u043e \u0432 \u043d\u0451\u043c \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e.<\/p>\n<p>  \u0420\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432 \u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445: \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441, \u043d\u0435 \u0434\u043e\u0436\u0438\u0434\u0430\u044f\u0441\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c health check endpoint \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0435 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c 503, \u043f\u043e\u043a\u0430 \u043e\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f, \u0438 200, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0443\u0436\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438\u0441\u044c.<\/p>\n<p>  \u0427\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u043a\u043e\u0433\u0434\u0430 \u044f \u0438\u0437\u0443\u0447\u0430\u043b \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0441\u043a\u0435\u043f\u0441\u0438\u0441. \u0412\u0441\u0451 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438\u043c \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u043c\u0438. \u0410 \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u044e, \u0442\u043e \u044d\u0442\u043e \u043a\u0430\u043a \u0441\u043d\u043e\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/twitter.com\/AlcoHistory\/status\/1247875920347770880?s=20\">EAP-\u043f\u043e\u0434\u0445\u043e\u0434<\/a> \u0441 \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u043e\u0439 \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u0432\u043c\u0435\u0441\u0442\u043e \u0443\u0436\u0435 \u0441\u0442\u0430\u0432\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c async\/await.<\/p>\n<p>  \u041d\u043e \u0442\u0443\u0442 \u0432 \u0438\u0433\u0440\u0443 \u0432\u0441\u0442\u0443\u043f\u0438\u043b Kubernetes. \u0423 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f readiness probe. \u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u0446\u0438\u0442\u0430\u0442\u0443 \u0438\u0437 \u043a\u043d\u0438\u0433\u0438 \u00abKubernetes in Action\u00bb \u0432 \u043c\u043e\u0451\u043c \u0432\u043e\u043b\u044c\u043d\u043e\u043c \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0438:  <\/p>\n<blockquote><p>\u0412\u0441\u0435\u0433\u0434\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0439\u0442\u0435 readiness probe.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 readiness probe, \u0432\u0430\u0448\u0438 \u043f\u043e\u0434\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f endpoint\u2019\u0430\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u2013 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0431\u0443\u0434\u0443\u0442 \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u00abConnection refused\u00bb.<\/p><\/blockquote>\n<p>  \u042f \u043f\u0440\u043e\u0432\u0451\u043b \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442: \u0441\u043e\u0437\u0434\u0430\u043b \u0441\u0435\u0440\u0432\u0438\u0441 ASP.NET Core 3 c \u0434\u043e\u043b\u0433\u043e\u0439 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0432 HostedService:<\/p>\n<pre><code class=\"cs\">public class LongTaskHostedService : IHostedService {     public async Task StartAsync(CancellationToken cancellationToken)     {             Console.WriteLine(&quot;Long task started...&quot;);             await Task.Delay(5000, cancellationToken);             Console.WriteLine(&quot;Long task finished.&quot;);     }      public Task StopAsync(CancellationToken cancellationToken)     {...} }<\/code><\/pre>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u044d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e minikube, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434 \u0434\u043e \u0434\u0432\u0443\u0445, \u0442\u043e \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 5 \u0441\u0435\u043a\u0443\u043d\u0434 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u043c\u043e\u0439 \u0432\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u0434\u0430\u0432\u0430\u043b \u043d\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0430 \u00abConnection refused\u00bb.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">UPD \u043e\u0442 Kubernetes 1.16<\/b><\/p>\n<div class=\"spoiler_text\">\u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0443\u0436\u0435 \u0431\u044b\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430, \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0432 Kubernetes 1.16 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c startup probe (\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432). \u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u044f \u043d\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0441\u044f, \u0447\u0435\u043c \u043e\u043d\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 readiness probe. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445\u0441\u044f \u043e\u0442\u0441\u044b\u043b\u0430\u044e \u043a <a href=\"https:\/\/kubernetes.io\/docs\/tasks\/configure-pod-container\/configure-liveness-readiness-startup-probes\/\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>. \u041c\u043e\u0436\u0435\u043c \u0432\u043c\u0435\u0441\u0442\u0435 \u043e\u0431\u0441\u0443\u0434\u0438\u0442\u044c \u044d\u0442\u043e \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.  <\/div>\n<\/div>\n<p>  <\/p>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<p>  \u041a\u0430\u043a\u043e\u0439 \u0432\u044b\u0432\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439? \u041f\u043e\u0436\u0430\u043b\u0443\u0439, \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0430\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043a\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442 \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e. \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0430 \u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u043e\u0432, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 GetAwaiter().GetResult() \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f IHostedService \u0432 ASP.NET Core 3.x.<\/p>\n<p>  \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 Kubernetes \u0438 \u0432\u0430\u0448\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0449\u0443\u0442\u0438\u043c\u043e \u0434\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0442\u043e \u0431\u0435\u0437 health check (\u043e\u043d \u0436\u0435 readiness\/startup probe) \u0432\u0430\u043c \u043d\u0435 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c.<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/496300\/\"> https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/496300\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/496300\/\">\u0421 \u0442\u0435\u0445 \u043f\u043e\u0440, \u043a\u0430\u043a \u0432 C# 5.0 \u0437\u0430\u0432\u0435\u0437\u043b\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c async\/await, \u043d\u0430\u0441 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0432\u043e \u0432\u0441\u0435\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u0438 \u0434\u043e\u043a\u0430\u0445 \u0443\u0447\u0430\u0442, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e. \u0418 \u043f\u0440\u0438\u0437\u044b\u0432\u0430\u044e\u0442 \u0431\u043e\u044f\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043e\u0433\u043d\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 GetAwaiter().GetResult(). \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u0438\u043d \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0441\u0430\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b Microsoft \u043d\u0435 \u0433\u043d\u0443\u0448\u0430\u044e\u0442\u0441\u044f \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yl\/m9\/nb\/ylm9nbu--2sz9pzjxu-tgx8k5t4.png\">   <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-301572","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/301572","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=301572"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/301572\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=301572"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=301572"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=301572"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}