Как сохранить переменную области действия между промежуточным ПО и службами в .NET Core?C#

Место общения программистов C#
Ответить
Anonymous
 Как сохранить переменную области действия между промежуточным ПО и службами в .NET Core?

Сообщение Anonymous »

Я пытаюсь создать иерархическую структуру журналирования в API .NET Core. Моя цель — создать идентификатор журнала в промежуточном программном обеспечении и использовать его в качестве родительского идентификатора для журналов в последующих вызовах API. Я хочу, чтобы каждое обращение к API имело уникальный идентификатор журнала, который должен быть доступен всем моим сервисам.
Вот что я уже сделал:
  • Я создал LoggingMiddleware, который генерирует идентификатор журнала.
  • Я храню идентификатор журнала в классе LogIdSaver, зарегистрированном как ограниченный service.
  • Я добавляю LogIdSaver в свой DashboardService для доступа к идентификатору журнала.
Проблема, с которой я столкнулся, заключается в том, что промежуточное программное обеспечение не может правильно внедрить LogIdSaver, что приводит к ошибкам. Моему промежуточному ПО необходимо сохранить сгенерированный идентификатор журнала и сделать его доступным для моей службы, но, похоже, оно работает не так, как ожидалось.
Код:
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(); });
}
}
}
LoggingMiddleware.cs:

Код: Выделить всё

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);
}
}
}
DashboardService.cs:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»