рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк ASP.NET рдХреЛрд░ рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб: GetAwaiter ()ред GetResult () рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЖрдиреЗ рдХреЗ 4 рддрд░реАрдХреЗред

рдЪреВрдБрдХрд┐ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЛ C # 5.0 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд╕рднреА рд▓реЗрдЦреЛрдВ рдФрд░ рдбреЙрдХреНрд╕ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рд╕рд┐рдЦрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдмреБрд░рд╛ рд╣реИред рдФрд░ рд╡реЗ GetAwaiter () GetResult () рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдЬреИрд╕реЗ рдбрд░ рдХрд╛ рдЖрд╣реНрд╡рд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд╣рд╛рдБ Microsoft рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реНрд╡рдпрдВ рдЗрд╕ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рддрд┐рд░рд╕реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред



рдХрд╛рд░реНрдп рдХрд╛рд░реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреГрд╖реНрдарднреВрдорд┐


рдЕрдм рд╣рдо рд╡рд┐рд░рд╛рд╕рдд рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗ OAuth 2.0 рддрдХ рд╕рдВрдХреНрд░рдордг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реИрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдЙрджреНрдпреЛрдЧ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдорд╛рдирдХ рд╣реИред рдЕрдм рдореИрдВ рдЬрд┐рд╕ рд╕реЗрд╡рд╛ рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдирдИ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдФрд░ рдЬреЗрдбрдмреНрд▓реНрдпреВрдЯреА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рдпрд▓рдЯ рдмрди рдЧрдИ рд╣реИред

рдПрдХреАрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рд╣рдордиреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛, рдХрд┐ рдЯреЛрдХрди рдкреНрд░рджрд╛рддрд╛ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ IdentityServer) рдкрд░ рднрд╛рд░ рдХреИрд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдкреВрд░реА рдкреНрд░рдгрд╛рд▓реА рдХреА рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХреА рдЬрд╛рдПред JWT- рдЖрдзрд╛рд░рд┐рдд рд╕рддреНрдпрд╛рдкрди рдХреЛ ASP.NET рдХреЛрд░ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ рдФрд░ рдЯреЛрдХрди рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ:

services
      .AddAuthentication()
      .AddJwtBearer(); 

рд▓реЗрдХрд┐рди рдЗрди рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рдЫрд┐рдкрд╛ рд╣реИ? рдЙрдирдХреЗ рд╣реБрдб рдХреЗ рддрд╣рдд, рдПрдХ JWTBearerHandler рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдкреАрдЖрдИ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ JWT рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред


рдХреНрд▓рд╛рдЗрдВрдЯ, рдПрдкреАрдЖрдИ рдФрд░ рдЯреЛрдХрди рдкреНрд░рджрд╛рддрд╛

рд╕реЗ рдмрд╛рддрдЪреАрдд рдЬрдм JWTBearerHandler рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдкреНрд░рджрд╛рддрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди рдирд╣реАрдВ рднреЗрдЬрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рд╛рдЗрдирд┐рдВрдЧ рдХреБрдВрдЬреА рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ - рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП рдХреБрдВрдЬреА рдХрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣рд┐рд╕реНрд╕рд╛ред рдЗрд╕ рдХреБрдВрдЬреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЯреЛрдХрди рд╕рд╣реА рдкреНрд░рджрд╛рддрд╛ рджреНрд╡рд╛рд░рд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╣реИред

рдЕрдВрджрд░ JWTBearerHandler HttpClient рдмреИрдарддрд╛ рд╣реИ, рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдпрджрд┐ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░рджрд╛рддрд╛ рдХреА рд╕рд╛рдЗрдирд┐рдВрдЧ рдХреБрдВрдЬреА рдЕрдХреНрд╕рд░ рдмрджрд▓рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛рддреА рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдЖрдк рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдХреИрд╢ рдХрд░реЗрдВ рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВред

рдореБрдЭреЗ рдпрд╣ рдХреЛрдб рд╕рд╛рдЗрдирд┐рдВрдЧ рдХреБрдВрдЬреА рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛ рд╣реИ:

public static AuthenticationBuilder AddJwtAuthentication(this AuthenticationBuilder builder, AuthJwtOptions options)
{
    var signingKeys = new List<SecurityKey>();

    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 =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                // ...
                IssuerSigningKeys = signingKeys,
                // ...
            };
        });
    return builder;
}

рдкрдВрдХреНрддрд┐ 12 рдореЗрдВ рд╣рдо рдорд┐рд▓рддреЗ рд╣реИрдВред рдЧреЗрдЯрдПрд╡рд╛рдЯрд░ ()ред GetResult ()ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ AuthenticationBuilder рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╢реВрдиреНрдп рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕рд░реНрд╡рд┐рд╕реЗрдЬ (IServiceCollection Services) {Startup class рдХреЗ {...} рдХреЗ рдЕрдВрджрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИред рдореБрд╕реАрдмрддред

C # 7.1 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЗрди () рд╣реИред рд▓реЗрдХрд┐рди Asp.NET Core рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдзрд┐рдпрд╛рдВ рдЕрднреА рддрдХ рд╡рд┐рддрд░рд┐рдд рдирд╣реАрдВ рдХреА рдЧрдИ рд╣реИрдВред рдореИрдВ GetAwaiter ()ред GetResult () (рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛!) тАЛтАЛрд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реМрдВрджрд░реНрдпрд╢рд╛рд╕реНрддреНрд░реАрдп рд░реВрдк рд╕реЗ рдкрд░реЗрд╢рд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдСрдирд▓рд╛рдЗрди рджреЗрдЦрдиреЗ рдЧрдпрд╛ рдерд╛ред

рдореИрдВ GetAwaiter () рд╕реЗ рдкрд░реЗрд╢рд╛рди рд╣реВрдБред GetResult (), рд▓реЗрдХрд┐рди Microsoft рдирд╣реАрдВ рд╣реИ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкрд╛рдпрд╛ рдХрд┐ Microsoft рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ Azure KeyVault рдХреЗ рд░рд╣рд╕реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ ред рдпрджрд┐ рдЖрдк рдЕрдореВрд░реНрддрддрд╛ рдХреА рдХрдИ рдкрд░рддреЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ:

public override void Load() => LoadAsync().ConfigureAwait(false).GetAwaiter().GetResult();

рд╣реИрд▓реЛ рдлрд┐рд░ рд╕реЗ, GetAwaiter ()ред GetResult ()! рдХреНрдпрд╛ рдХреЛрдИ рдФрд░ рдЙрдкрд╛рдп рд╣реИ?

рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ Google рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдПрдВрдбреНрд░рдпреВ рд▓реЙрдХ рджреНрд╡рд╛рд░рд╛ рдХрдИ рдмреЗрд╣рддрд░реАрди рд▓реЗрдЦ рдорд┐рд▓реЗ , рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдореЗрд░реЗ рдЬреИрд╕реЗ рд╣реА рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдерд╛ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдорд╛рди рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рднреА - рд╡рд╣ рд╕реМрдВрджрд░реНрдпрд╢рд╛рд╕реНрддреНрд░ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рдЙрди рд╕рднреА рдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдЬреЛ рдПрдВрдбреНрд░рдпреВ рджреНрд╡рд╛рд░рд╛ рдкрд╛рдВрдЪ рд▓реЗрдЦреЛрдВ рдХреА рдкреВрд░реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рд╡рд╣рд╛рдВ, рд╡рд╣ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдХрд╛рд░реНрдп рдХрд╛рд░реНрдп рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЬрдиреНрдо рджреЗрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдХрдИ рдЧрд▓рдд рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЕрдкрдиреЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдЙрдирдХреЗ рд╢реЛрдз рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд┐рдЪреЛрдбрд╝ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рдПрдХ рд╡реЗрдм рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рднреВрдорд┐рдХрд╛


рдкреВрд░реА рддрд╕реНрд╡реАрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрджрдо рдкреАрдЫреЗ рд╣рдЯреЗрдВред рд╡реИрдЪрд╛рд░рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЪрд╛рд╣реЗ рд╡рд╣ рдХреЛрдИ рднреА рдврд╛рдВрдЪрд╛ рд╣реЛ?
рд╕рдорд╕реНрдпрд╛: рдпрд╣ рд╡реЗрдм рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗ, рд▓реЗрдХрд┐рди рдХреБрдЫ (рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд) рд▓рдВрдмреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рд╕реЗрд╡рд╛ рдпрд╛ рддреЛ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗ рд╕рдХрддреА рд╣реИ, рдпрд╛ рдЗрд╕рдХреЗ рдЙрддреНрддрд░ рдЧрд▓рдд рд╣реЛрдВрдЧреЗред
рдРрд╕реЗ рдСрдкрд░реЗрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдг:

  • рджреГрдврд╝рддрд╛ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд╕рддреНрдпрд╛рдкрдиред
  • рдХреИрд╢ рднрд░рдирд╛ред
  • рдбреЗрдЯрд╛рдмреЗрд╕ рдпрд╛ рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрдиреЗрдХреНрд╢рдиред
  • JIT рдФрд░ рдЕрд╕реЗрдВрдмрд▓реА рд▓реЛрдбрд┐рдВрдЧ (рд╕реЗрд╡рд╛ рд╡рд╛рд░реНрдорд┐рдВрдЧ рдЕрдк)ред
  • рдбреЗрдЯрд╛рдмреЗрд╕ рдкреНрд░рд╡рд╛рд╕рдиред рдпрд╣ рдПрдВрдбреНрд░рдпреВ рд▓реЙрдХ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╣ рдЦреБрдж рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдЦрд┐рд░рдХрд╛рд░, рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдСрдкрд░реЗрд╢рди рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИ ред

рдореИрдВ рдПрдХ рд╕рдорд╛рдзрд╛рди рдвреВрдВрдврдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдЬреЛ рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рддрд░реАрдХреЗ рд╕реЗ, рдЧреЗрдЯрд╡рд╛рдЯрд░ () рдХреЗ рдмрд┐рдирд╛ред GetResult ()ред

рдЕрдиреБрд░реЛрдз рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЖрд╡реЗрджрди рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рдкрдВрдЬреАрдХреГрдд рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ DI рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЖрд░реЗрдЦ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


рд╕рдорд╛рдзрд╛рди # 1: рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдорд╛рдзрд╛рди рдЬреЛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░рд┐рдпреЛрдВ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ


рддрд╛рд▓рд╛ рджреНрд╡рд╛рд░рд╛ рдкреЗрд╢ рдкрд╣рд▓рд╛ рдХрд╛рдо рд╕рдорд╛рдзрд╛рди :

public class Program
{
   public static async Task Main(string[] args)
   {
       IWebHost webHost = CreateWebHostBuilder(args).Build();

       using (var scope = webHost.Services.CreateScope())
       {
           //   
           var myService = scope.ServiceProvider.GetRequiredService<MyService>();

           await myService.DoAsyncJob();
       }

       await webHost.RunAsync();
   }

   public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
       WebHost.CreateDefaultBuilder(args)
           .UseStartup<Startup>();
}

рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг C # 7.1 рд╕реЗ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдореЗрди () рдХреЗ рдЖрдЧрдорди рд╕реЗ рд╕рдВрднрд╡ рд╣реБрдЖред рдЗрд╕рдХрд╛ рдХреЗрд╡рд▓ рдирдХрд╛рд░рд╛рддреНрдордХ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдордиреЗ Startup.cs рд╕реЗ Program.cs рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рднрд╛рдЧ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред ASP.NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдЧреИрд░-рдорд╛рдирдХ рд╕рдорд╛рдзрд╛рди рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░реЗрдЧрд╛ред

рд╕рдорд╛рдзрд╛рди # 2: DI рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдПрдореНрдмреЗрдб рдХрд░реЗрдВ


рдЗрд╕рд▓рд┐рдП, рдПрдВрдбреНрд░рдпреВ рдиреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдПрдХ рдмреЗрд╣рддрд░ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

public interface IStartupTask
{
    Task ExecuteAsync(CancellationToken cancellationToken = default);
}

DI рдореЗрдВ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐:

public static class ServiceCollectionExtensions
{
    public static IServiceCollection AddStartupTask<T>(this IServiceCollection services)
        where T : class, IStartupTask
        => services.AddTransient<IStartupTask, T>();
}

рдЕрдЧрд▓рд╛, рдПрдХ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдШреЛрд╖рд┐рдд рдХреА рдЧрдИ рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА IWebHost рдХреЗ рд▓рд┐рдП:

public static class StartupTaskWebHostExtensions
{
    public static async Task RunWithTasksAsync(this IWebHost webHost, CancellationToken cancellationToken = default)
    {
        //      DI
        var startupTasks = webHost.Services.GetServices<IStartupTask>();

        //   
        foreach (var startupTask in startupTasks)
        {
            await startupTask.ExecuteAsync(cancellationToken);
        }

        //    
        await webHost.RunAsync(cancellationToken);
    }
}

рдФрд░ Program.cs рдореЗрдВ рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рд▓рд╛рдЗрди рдмрджрд▓рддреЗ рд╣реИрдВред рдмрдЬрд╛рдп:

await CreateWebHostBuilder(args).Build().Run();

рд╣рдо рдлреЛрди рдХрд░рддреЗ рд╣реИрдВ:

await CreateWebHostBuilder(args).Build().RunWithTasksAsync();

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рдорд╣рд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬреЛ рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдпрдерд╛рд╕рдВрднрд╡ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕рдорд╛рдзрд╛рди # 3: рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ ASP.NET Core 3.x рдкрд░ рдЧрдП рдереЗ


рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк ASP.NET Core 3.x рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдореИрдВ рдлрд┐рд░ рд╕реЗ рдПрдВрдбреНрд░рдпреВ рд▓реЙрдХ рдХреЗ рдПрдХ рд▓реЗрдЦ рдХрд╛ рд╕рдВрджрд░реНрдн рджреВрдВрдЧрд╛ ред

рдпрд╣рд╛рдБ ASP.NET Core 2.x рд╕реЗ WebHost рд▓реЙрдиреНрдЪ рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

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
    }
}

рдФрд░ рдпрд╣рд╛рдБ ASP.NET Core 3.0 рдореЗрдВ рд╕рдорд╛рди рд╡рд┐рдзрд┐ рд╣реИ:

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
    }
}

ASP.NET Core 3.x рдореЗрдВ, HostedServices рдкрд╣рд▓реЗ рд▓реЙрдиреНрдЪ рдХреА рдЧрдИ рд╣реИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдореБрдЦреНрдп WebHost, рдФрд░ рдкрд╣рд▓реЗ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рдкрд░реАрдд рдерд╛ред рдпрд╣ рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ? рдЕрдм рд╕рднреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ IHostedService рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ StartAsync (рдХреИрдВрд╕реЗрд▓реЗрд╢рдирдЯреЛрдХрди) рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдП рдмрд┐рдирд╛ рдПрдХ рд╣реА рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдорд╛рдзрд╛рди # 4: рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЬрд╛рдВрдЪ рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯ рдХреА рдХрд╣рд╛рдиреА


рдЗрд╕ рдкрд░ рдПрдХ рд╢рд╛рдВрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рдФрд░ рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛рдУрдВ рдореЗрдВ рдЕрдЪрд╛рдирдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЬрд╛рдВрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИред

рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ Kestrel рд╕рд░реНрд╡рд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╕рднреА рдЧреИрд░-рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЬрд╛рдВрдЪ рдЕрдиреБрд░реЛрдз 503 (рд╕реЗрд╡рд╛ рдЕрдиреБрдкрд▓рдмреНрдз) рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВрдЧреЗред ASP.NET рдХреЛрд░ рдореЗрдВ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЬрд╛рдВрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Microsoft рд╕рд╛рдЗрдЯ рдкрд░ рдПрдХ рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рд▓реЗрдЦ рд╣реИ ред рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдкрд░ рд▓рд╛рдЧреВ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд┐рдирд╛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдПрдВрдбреНрд░рдпреВ рд▓реЙрдХ рдХреЗ рдкрд╛рд╕ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рд╣реИ ред рдЗрд╕рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдиреЗрдЯрд╡рд░реНрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕реЗ рдмрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред
, , , . Kestrel , , ┬л ┬╗.

рдореИрдВ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЬрд╛рдВрдЪ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдкреВрд░реНрдг рдПрдВрдбреНрд░рдпреВ рд▓реЙрдХ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛ред рдпрд╣ рдХрд╛рдлреА рд╕реНрд╡реИрдЪреНрдЫрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЖрдкрдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реВрдВ: рдЖрдкрдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рд╡реЗрдм рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЬрд╛рдВрдЪ рдХреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рдЗрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, 503 рдЬрд╛рд░реА рдХрд░рдирд╛ рдЬрдмрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдФрд░ 200 рдЬрдм рд╡реЗ рдкрд╣рд▓реЗ рд╣реА рдкреВрд░рд╛ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВред

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛, рддреЛ рдореБрдЭреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрджреЗрд╣ рдерд╛ред рдкрд┐рдЫрд▓реЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдмреЛрдЭрд┐рд▓ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдФрд░ рдЕрдЧрд░ рд╣рдо рдПрдХ рд╕рд╛рджреГрд╢реНрдп рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╣реИ рдХрд┐ рдИрдПрдкреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдлрд┐рд░ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ , рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░рд┐рдЪрд┐рдд рдПрдПрд╕рдХреНрдпреВрдПрди рдпрд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрдЬрд╛рдп рдИрд╡реЗрдВрдЯ рд╕рджрд╕реНрдпрддрд╛ рдХреЗ рд╕рд╛рдеред

рд▓реЗрдХрд┐рди рдлрд┐рд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЦреЗрд▓ рдореЗрдВ рдЖ рдЧрдпрд╛ред рддрддреНрдкрд░рддрд╛ рдЬрд╛рдВрдЪ рдХреА рдЙрдирдХреА рдЕрдкрдиреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рдореИрдВ рдЕрдкрдиреА рдореБрдлреНрдд рдкреНрд░рд╕реНрддреБрддрд┐ рдореЗрдВ "рдПрдХреНрд╢рди рдореЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕" рдкреБрд╕реНрддрдХ рд╕реЗ рдЙрджреНрдзреГрдд рдХрд░реВрдВрдЧрд╛:
рд╣рдореЗрд╢рд╛ рддрддреНрдкрд░рддрд╛ рдЬрд╛рдВрдЪ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рддрддреНрдкрд░рддрд╛ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдкрдХреА рдлрд▓реА рд▓рдЧрднрдЧ рддреБрд░рдВрдд рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдмрди рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХрд╛ рдЖрд╡реЗрджрди рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрддрд╛ рд╣реИ, рддреЛ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЙрди рдкреЙрдбреНрд╕ рдХреЛ рднреА рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЕрднреА рддрдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ "рдХрдиреЗрдХреНрд╢рди рдЕрд╕реНрд╡реАрдХреГрдд" рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреАред

рдореИрдВрдиреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛: рдореИрдВрдиреЗ HostedService рдореЗрдВ рд▓рдВрдмреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде ASP.NET Core 3 рд╕реЗрд╡рд╛ рдмрдирд╛рдИ:

public class LongTaskHostedService : IHostedService
{
    public async Task StartAsync(CancellationToken cancellationToken)
    {
            Console.WriteLine("Long task started...");
            await Task.Delay(5000, cancellationToken);
            Console.WriteLine("Long task finished.");
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {...}
}

рдЬрдм рдореИрдВрдиреЗ рдорд┐рдиреАрдХреНрдпреВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдФрд░ рдлрд┐рд░ рджреЛ рд╕реЗ рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреА, рддреЛ рджреЗрд░реА рдХреЗ 5 рд╕реЗрдХрдВрдб рдХреЗ рднреАрддрд░, рдореЗрд░рд╛ рд╣рд░ рджреВрд╕рд░рд╛ рдЕрдиреБрд░реЛрдз рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди "рдХрдиреЗрдХреНрд╢рди рдиреЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛"ред

рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ 1.16 рдпреВрдкреАрдбреА
, , Kubernetes 1.16 startup probe ( ). , readiness probe. . .

рдЬрд╛рдБрдЪ - рдкрд░рд┐рдгрд╛рдо


рдЗрди рд╕рднреА рдЕрдзреНрдпрдпрдиреЛрдВ рд╕реЗ рдХреНрдпрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рд╢рд╛рдпрдж рд╕рднреА рдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рддрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреМрди рд╕рд╛ рд╕рдорд╛рдзрд╛рди рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИред рдпрджрд┐ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордп рдирд╣реАрдВ рд▓рдЧреЗрдЧрд╛, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯреНрд╕ рдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рддрд░рд╣ рдХреА рд░рд┐рдЯреНрд░реА рдкреЙрд▓рд┐рд╕реА рд╣реИ, рддреЛ рдЖрдк GetAwaiter () GetResult () рдФрд░ ASP.NET Core 3.x.x рдореЗрдВ IHITedService рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рджреВрд╕рд░реА рдУрд░, рдпрджрд┐ рдЖрдк рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕реНрд╡рд╛рд╕реНрдереНрдп рдЬрд╛рдВрдЪ (рдЙрд░реНрдл рддрддреНрдкрд░рддрд╛ / рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдЬрд╛рдВрдЪ) рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

All Articles