IHttpContextAccessor.HttpContext является недействительным в производственной среде - PullRequest
1 голос
/ 06 января 2020

У меня есть приложение Blazor Server, которое ведет себя по-разному в процессе разработки и производства. Проблема в том, что на производстве HttpContext всегда равно нулю в классах обслуживания

Все классы обслуживания являются производными от класса BaseService. В конструктор вводятся все зависимости. Также IHttpContextAccessor.

BaseService.cs

//Condensed down...
public abstract class BaseService
{    
    private IHttpContextAccessor _httpContextAccessor;      
    protected HttpContext HttpContext { get { return _httpContextAccessor.HttpContext; } }

    protected BaseService(IConfiguration configuration,
                          UserManager<MyProjectIdentityUser> userManager,
                          IHttpContextAccessor httpContextAccessor,
                          Repositories.MyDbContext dbContext,
                          ILogger<object> logger)
    {
        //...
        _httpContextAccessor = httpContextAccessor;
        //...
    }

    public async Task<MyProjectIdentityUser> GetUserAsync()
    {
        //Here is the HttpContext always null...
        var user = await UserManager.FindByIdAsync(HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value);
        return user;
    }
}

Всякий раз, когда мне нужен текущий пользователь в одном из классов обслуживания, я вызываю var user = GetUserAsync(); и получаю его.

Эта реализация отлично работает, когда я отлаживаю приложение в visual studio, но в производственном процессе я не могу получить доступ к HttpContext. Производственная среда представляет собой комбинацию Ubuntu 18, Apache2 и Cloudflare.

В настоящее время я не знаю, с чего начать. Все остальное в производстве тоже работает. Пока я не пытаюсь получить доступ к HttpContext.

1 Ответ

1 голос
/ 06 января 2020

Как я и подозревал, не было проблем с кодом, но с окружающей средой. Не может быть установлено соединение WebSocket. Для этого требуется некоторая конфигурация на сервере Apache2

  1. Все необходимые модули должны быть включены. В моем случае это было rewrite proxy_wstunnel Мне пришлось включить с помощью.

    a2enmod rewrite    
    a2enmod proxy_wstunnel
    
  2. .conf для приложения

    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:5000/
    ProxyPassReverse / http://127.0.0.1:5000/
    
    RewriteEngine on
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
    RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
    RewriteRule /(.*) ws://127.0.0.1:5000/$1 [P]
    

Теперь HttpContext доступен.

...