.net core IHttpContextAccessor.HttpContext在生产环境中为空

.net core IHttpContextAccessor.HttpContext在生产环境中为空,.net-core,apache2,cloudflare,blazor-server-side,asp.net-core-3.1,.net Core,Apache2,Cloudflare,Blazor Server Side,Asp.net Core 3.1,我有一个Blazor服务器应用程序,它在开发和生产中的表现不同。问题是,在生产环境中,服务类中的HttpContext始终为空 所有服务类都派生自BaseService类。构造函数中注入了所有依赖项。还有IHttpContextAccessor BaseService.cs //Condensed down... public abstract class BaseService { private IHttpContextAccessor _httpContextAccesso

我有一个Blazor服务器应用程序,它在开发和生产中的表现不同。问题是,在生产环境中,服务类中的
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;
    }
}
//浓缩成。。。
公共抽象类基服务
{    
专用IHttpContextAccessor_httpContextAccessor;
受保护的HttpContext HttpContext{get{return}\u httpContextAccessor.HttpContext;}
受保护的基本服务(IConfiguration配置,
用户管理器用户管理器,
IHttpContextAccessor httpContextAccessor,
Repositories.MyDbContext dbContext,
ILogger(记录器)
{
//...
_httpContextAccessor=httpContextAccessor;
//...
}
公共异步任务GetUserAsync()
{
//以下是HttpContext始终为空。。。
var user=await UserManager.FindByIdAsync(HttpContext.user.FindFirst(ClaimTypes.NameIdentifier.Value));
返回用户;
}
}
每当我需要其中一个服务类中的当前用户时,我调用
var user=GetUserAsync()并获取它

当我在VisualStudio中调试应用程序时,此实现非常有效,但在生产环境中,我无法访问
HttpContext
。 生产环境是Ubuntu 18、Apache2和Cloudflare的组合

目前,我不知道从哪里开始寻找。
生产中的其他一切也都起作用。只要我不尝试访问HttpContext。

正如我所怀疑的,代码没有问题,但是环境有问题。无法建立WebSocket连接。这需要在Apache2服务器中进行一些配置

  • 必须启用所有必需的模块。在我的例子中,它是
    rewrite
    proxy\u wstunnel
    我必须启用的

    a2enmod rewrite    
    a2enmod proxy_wstunnel
    
  • 应用程序的.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

    您如何使用该服务?我将它们注入到razor页面/组件中。