如何仅在应用程序启动时调用中间件,而不是在 .net core api 中的每个请求?

How to invoke middleware only when the app is started, not for every request in .net core api?

我写了一个中间件,可以从 git 下载一些文件。但是我想在应用程序启动时将中间件调用限制为仅一次。所以这些文件应该只在应用程序启动时下载,而不是在每次请求时都下载。 注意- 中间件是自定义 nuget 包的一部分,许多服务将在启动时重复使用它来下载文件,而不是针对特定服务

请参阅代码片段以供参考。 TIA

    {
        public static IApplicationBuilder UseTlsEnableMiddleware(this IApplicationBuilder app, IHostEnvironment env, OracleTlsConfigurations oraTlsConfigurations)
        {
            return app.UseMiddleware<OracleTlsMiddleware>(env, oraTlsConfigurations);
        }
    }


public class OracleTlsMiddleware
    {
        RequestDelegate _next;
        public OracleTlsMiddleware(RequestDelegate next, IHostEnvironment env, OracleTlsConfigurations oraTlsConfigurations)
        {
            _next = next;
            if (oraTlsConfigurations != null)
            {
                _oraTlsConfigurations = oraTlsConfigurations;
                _env = env;
            }
            else
                throw new Exception("Oracle Tls Configurations not found in cofig file");
        }

        public async Task InvokeAsync(HttpContext context)
        {
            try
            {
                await _next(context);
                //some work to download file
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception occured while donloading oracle TLS files: {ex.Message}");
                throw ex;
            }
        }
    }

public void Configure(IApplicationBuilder app, IHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            var oracleTlsConfig = Configuration.GetSection("OracleTlsConfigurations").Get<OracleTlsConfigurations>();
            app.UseTlsEnableMiddleware(env, oracleTlsConfig);

            app.UseSwagger();

            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint("/swagger/V1/swagger.json", "Sales Order Details");
            });

            app.UseRouting();
            app.UseCors();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }```

为了解决这个问题,您不需要制作中间件。只是写一个方法并在你的 startup.cs.

中执行它

恐怕自定义中间件组件可能无法按预期工作,因为中间件组件被插入到 asp.net 管道中并在每次请求时被调用。如果自定义组件的全部目的只是下载文件,你可以把它写成一个普通的 class 并直接在 Startup.cs

中调用它
public class OracleTlsMiddleware
{
    public OracleTlsMiddleware(IHostEnvironment env, OracleTlsConfigurations oraTlsConfigurations)
    {
        if (oraTlsConfigurations != null)
        {
            _oraTlsConfigurations = oraTlsConfigurations;
            _env = env;
        }
        else
            throw new Exception("Oracle Tls Configurations not found in cofig file");
    }

    public void DownloadFiles()
    {
        try
        {
            //some work to download file
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Exception occured while donloading oracle TLS files: {ex.Message}");
            throw ex;
        }
    }
}

public void Configure(IApplicationBuilder app, IHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    var oracleTlsConfig = Configuration.GetSection("OracleTlsConfigurations").Get<OracleTlsConfigurations>();
    var useTlsEnableMiddleware = new UseTlsEnableMiddleware(env, oracleTlsConfig);
    useTlsEnableMiddleware.DownloadFiles();
}

class为了便于理解,我没有改名。您可以根据上下文取一个更有意义的名字。