如何仅在应用程序启动时调用中间件,而不是在 .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为了便于理解,我没有改名。您可以根据上下文取一个更有意义的名字。
我写了一个中间件,可以从 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为了便于理解,我没有改名。您可以根据上下文取一个更有意义的名字。