HttpContext всегда возвращает ноль - PullRequest
0 голосов
/ 08 июня 2018

У меня проблема с HttpContext, который всегда возвращает ноль.Я вставил свой код ниже.Я искал решение в Интернете, и хотя существует множество примеров того, что именно я пытаюсь сделать, я не смог найти решение.Может кто-нибудь сказать мне, что я делаю неправильно или что еще может быть причиной этого?

public class DatabaseTenantProvider : ITenantProvider
{
    private Guid _tenantId;

    public DatabaseTenantProvider(TenantContext context, IHttpContextAccessor accessor)
    {
        //this is always null
        var host = accessor.HttpContext.Request.Host.Value;

         _tenantId = context.GetTenantId(host);
    }
}

В моем стартапе у меня есть ...

 services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Я вызывал метод в своем классе DbInitializer, который создает и заполняет базу данных, если она еще не существует и / или не заполнена данными.Я передавал оба моих контекста базы данных этому методу следующим образом.

public static void Main(string[] args)
    {
        var host = BuildWebHost(args);

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;
            try
            {

                var context = services.GetRequiredService<PrimaryContext>();
                var tenantContext = services.GetRequiredService<SecondaryContext>();
                DbInitializer.Initialize(primaryContext, secondaryContext);
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred while seeding the database.");
            }
        }

        host.Run();
    }

Вызов метода GetRequiredService для передачи контекстов методу Initialize приводил к тому, что IHttpContextAccessor возвращал значение null в моем классе DatabaseTenantProvider.Я не совсем понимаю, почему это происходит, поэтому я был бы очень признателен, если бы кто-то мог объяснить / уточнить в комментарии ниже.

0 голосов
/ 08 июня 2018

Вы не должны использовать IHttpContextAccessor в конструкторе вашего класса.Вы должны сохранить это и использовать его, чтобы получить идентификатор арендатора следующим образом:

public class DatabaseTenantProvider : ITenantProvider
{
    public DatabaseTenantProvider(TenantContext context, IHttpContextAccessor accessor)
    {
        _contextAccessor = accessor; 
    }

    private readonly IHttpContextAccessor _contextAccessor;

    public Guid GetTenantId(TenantContext context)
    {
        var host = _contextAccessor.HttpContext.Request.Host.Value;
        return context.GetTenantId(host);
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...