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

C# 如何仅在应用程序启动时调用中间件,而不是针对.net核心api中的每个请求?,c#,.net,api,.net-core,middleware,C#,.net,Api,.net Core,Middleware,我已经写了一个中间件,它将从git下载一些文件。但我想在应用程序启动时将中间件调用限制为仅一次。因此,文件应该只在应用程序启动时下载,而不是在每次请求时下载。 注意-中间件是定制nuget包的一部分,许多服务将在启动时重用该包来下载文件,而不是针对特定的服务 请参阅代码片段以供参考。 短暂性脑缺血发作 { 公共静态IApplicationBuilder使用可感知中间件(此IApplicationBuilder应用程序、IHostEnvironment env、OracletlsConfigura

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

请参阅代码片段以供参考。 短暂性脑缺血发作

{
公共静态IApplicationBuilder使用可感知中间件(此IApplicationBuilder应用程序、IHostEnvironment env、OracletlsConfiguration或LSConfiguration)
{
返回app.useMidleware(env、oratlsConfiguration);
}
}
公共类OracletlSmidware
{
请求委托(下一步);
公共OracletlsMiddle软件(RequestDelegate next、IHostEnvironment env、OracletlsConfiguration或LSConfigurations)
{
_下一个=下一个;
如果(oraTlsConfigurations!=null)
{
_oraTlsConfigurations=oraTlsConfigurations;
_env=env;
}
其他的
抛出新异常(“cofig文件中未找到Oracle Tls配置”);
}
公共异步任务InvokeAsync(HttpContext上下文)
{
尝试
{
等待下一步(上下文);
//有些工作需要下载文件
}
捕获(例外情况除外)
{
Console.WriteLine($”加载oracle TLS文件时发生异常:{ex.Message}”);
掷骰子;
}
}
}
公共void配置(IApplicationBuilder应用程序,IHostEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
var oracleTlsConfig=Configuration.GetSection(“OracleTlsConfigurations”).Get();
app.UseTlsEnableMiddleware(env,oracleTlsConfig);
app.UseSwagger();
app.UseSwaggerUI(c=>
{
c、 SwaggerEndpoint(“/swagger/V1/swagger.json”,“销售订单详细信息”);
});
app.UseRouting();
app.UseCors();
app.UseEndpoints(端点=>
{
endpoints.MapControllers();
});
}
}```

要解决这个问题,您不需要制作中间件。只需编写一个方法并在startup.cs中执行它。

我担心自定义中间件组件可能无法按预期工作,因为中间件组件会插入到asp.net管道中,并在每次请求时被调用。如果定制组件的全部目的只是下载文件,那么您可以将其作为普通类编写,并直接在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();
}
public类oracletlsmiddle软件
{
公共OracletlSmidware(IHostEnvironment env、OracletlS配置或配置)
{
如果(oraTlsConfigurations!=null)
{
_oraTlsConfigurations=oraTlsConfigurations;
_env=env;
}
其他的
抛出新异常(“cofig文件中未找到Oracle Tls配置”);
}
公共无效下载文件()
{
尝试
{
//有些工作需要下载文件
}
捕获(例外情况除外)
{
Console.WriteLine($”加载oracle TLS文件时发生异常:{ex.Message}”);
掷骰子;
}
}
}
公共void配置(IApplicationBuilder应用程序,IHostEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
var oracleTlsConfig=Configuration.GetSection(“OracleTlsConfigurations”).Get();
var useTlsEnableMiddleware=新的useTlsEnableMiddleware(env,oracleTlsConfig);
useTlsEnableMiddleware.DownloadFiles();
}

我并没有为了理解而改变班级的名称。您可以根据上下文给出一个更有意义的名称。

请共享一个(问题中的代码)。您是否使用在InvokeAsync方法中作为参数传递的“context”对象?@DurgaPrasad,您可以给出一些示例吗?那会有帮助的。我已经编辑了我的帖子。。中间件是所有服务(自定义nuget的一部分)所共有的,而不是特定于一个服务。我同意这个答案。最终,您(OP)会问“如何使中间件不象中间件那样工作”,这意味着最初的实现是错误的。
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();
}