Вот что я уже сделал:
- Я создал LoggingMiddleware, который генерирует идентификатор журнала.
- Я храню идентификатор журнала в классе LogIdSaver, зарегистрированном как ограниченный service.
- Я добавляю LogIdSaver в свой DashboardService для доступа к идентификатору журнала.
Код:
Startup.cs:
Код: Выделить всё
namespace ElasticsearchApi
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton();
services.AddScoped(); // saving the logId
services.AddScoped();
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseMiddleware();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
}
}
}
Код: Выделить всё
namespace ElasticsearchApi.ElasticsearchLibrary
{
public class LoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly Logger _logger;
private readonly LogIdSaver _logIdSaver;
public LoggingMiddleware(RequestDelegate next, Logger logger, LogIdSaver logSaver)
{
_next = next;
_logger = logger;
_logIdSaver = logSaver;
}
public async Task InvokeAsync(HttpContext context)
{
var parentLogId = context.Request.Headers["LogId"].FirstOrDefault() ?? "";
if (string.IsNullOrEmpty(parentLogId))
_logIdSaver.logId = await _logger.LogNew(new Log());
else
_logIdSaver.logId = await _logger.LogNew(new Log(), parentLogId);
context.Response.OnCompleted(async () => { await _logger.LogComplete(_logIdSaver.logId); });
await _next(context);
}
}
}
Код: Выделить всё
namespace ElasticsearchApi.Services
{
public class DashboardService
{
private readonly Logger _logger;
private readonly LogIdSaver _logIdSaver;
public DashboardService(Logger logger, LogIdSaver logSaver)
{
_logger = logger;
_logIdSaver = logSaver;
}
public async Task GetAllDocuments()
{
Console.WriteLine(_logIdSaver.LogId); // To verify if the log ID from middleware is correctly accessed
var documents = await CallApi.CallGetAllDocuments(_logIdSaver.LogId);
return documents;
}
}
}
Экземпляр LogIdSaver в промежуточном программном обеспечении, похоже, неправильно сохраняет идентификатор журнала в промежуточном программном обеспечении и службах. . Как я могу сохранить идентификатор журнала, созданный в промежуточном программном обеспечении, чтобы к нему можно было постоянно обращаться в моих службах? Есть ли лучший подход к сохранению этого идентификатора для каждого обращения к API потокобезопасным способом?
Будем очень признательны за любые советы или решения. Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/791 ... n-net-core
Мобильная версия