IHttpContextAccessor.HttpContext 在生产环境中为空
IHttpContextAccessor.HttpContext is null in in production environment
我有一个 Blazor Server 应用程序,它在开发和生产中的行为不同。问题是,在生产中 HttpContext
在服务 classes
中始终为 null
所有服务 classes 派生自 BaseService
class。在构造函数中注入了所有依赖项。还有 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;
}
}
每当我需要其中一项服务 class 中的当前用户时,我都会调用 var user = GetUserAsync();
并获取它。
当我在 visual studio 中调试应用程序时,此实现完美运行,但在生产中,我无法访问 HttpContext
。
生产环境是Ubuntu18、Apache2和Cloudflare的组合。
目前,我不知道从哪里开始寻找。
生产中的其他一切也都有效。只要我不尝试访问 HttpContext。
正如我所怀疑的,代码没有问题,但环境有问题。它不可能是已建立的 WebSocket 连接。这需要在 Apache2 服务器中进行一些配置
必须启用所有必需的模块。在我的例子中,它是 rewrite
proxy_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/ [P]
现在 HttpContext
可用。
我有一个 Blazor Server 应用程序,它在开发和生产中的行为不同。问题是,在生产中 HttpContext
在服务 classes
所有服务 classes 派生自 BaseService
class。在构造函数中注入了所有依赖项。还有 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;
}
}
每当我需要其中一项服务 class 中的当前用户时,我都会调用 var user = GetUserAsync();
并获取它。
当我在 visual studio 中调试应用程序时,此实现完美运行,但在生产中,我无法访问 HttpContext
。
生产环境是Ubuntu18、Apache2和Cloudflare的组合。
目前,我不知道从哪里开始寻找。 生产中的其他一切也都有效。只要我不尝试访问 HttpContext。
正如我所怀疑的,代码没有问题,但环境有问题。它不可能是已建立的 WebSocket 连接。这需要在 Apache2 服务器中进行一些配置
必须启用所有必需的模块。在我的例子中,它是
rewrite
proxy_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/ [P]
现在 HttpContext
可用。