C# 注入后IHttpContextAccessor为空
我目前正在开发一个系统,根据来自不同网站设置的请求所属的域,需要加载(例如,默认语言id),然后在应用程序的其余部分中使用。这些设置存储在一个类C# 注入后IHttpContextAccessor为空,c#,asp.net-core,httpcontext,C#,Asp.net Core,Httpcontext,我目前正在开发一个系统,根据来自不同网站设置的请求所属的域,需要加载(例如,默认语言id),然后在应用程序的其余部分中使用。这些设置存储在一个类WebsiteSettings中,在需要时将其注入应用程序的其余部分 我尝试的第一个选项是在我的ConfigureServices方法中注册服务以访问HttpContext: public void ConfigureServices(IServiceCollection services) { //Register other services
WebsiteSettings
中,在需要时将其注入应用程序的其余部分
我尝试的第一个选项是在我的ConfigureServices
方法中注册服务以访问HttpContext
:
public void ConfigureServices(IServiceCollection services)
{
//Register other services
services.TryAddScoped<IHttpContextAccessor, HttpContextAccessor>();
services.TryAddScoped<WebsiteSettingsFiller>();
services.TryAddScoped(typeof(WebsiteSettings), s =>
{
var settingFiller = s.GetService<WebsiteSettingsFiller>();
return settingFiller.Create();
});
}
网站设置的示例注入
:
public class RouteService : BaseService
{
private IDictionary<int, string> _routeLanguages = null;
private readonly WebsiteRedisService _websiteRedisService;
public RouteService(IRepository db,
WebsiteSettings settings,
WebsiteRedisService websiteRedisService)
: base(db, settings)
{
_websiteRedisService = websiteRedisService;
}
public async Task<IDictionary<int, string>> RouteLanguagesAsync()
{
return _routeLanguages ??
(_routeLanguages = await _websiteRedisService.SiteLanguagesToAsync(Settings.SiteId));
}
}
公共类路由服务:BaseService
{
私有IDictionary _routeLanguages=null;
私有只读WebsiteRedisService\u WebsiteRedisService;
公共路由服务(IRepository db,
网站设置设置,
网站RedisService(网站RedisService)
:基本(db,设置)
{
_websiteRedisService=websiteRedisService;
}
公共异步任务RouteLanguagesAsync()
{
返回路径语言??
(_routeLanguages=wait _websiteRedisService.SiteLanguagesToAsync(Settings.SiteId));
}
}
遗憾的是,无论我尝试什么,HttpContext引用总是空的。有人知道我能解决什么吗?还是我只是以错误的方式处理这个问题?非常感谢您的任何建议 尝试注册为singleton:
services.TryAddSingleton()代码>遗憾的是,这并没有解决问题。另外,我认为它需要TryAddScoped
,因为HttpContext
访问器在每个请求中都会更改,对吗?在这里,有人声称HttpContextAccessor应该注册为singleton,否则它将无法工作(因为它的实现内部)。你确定是上下文为空,而不是请求或主机吗?在那里放一个断点并检查它。另外,您是否在请求期间调用此函数(而不是在startup类中-不存在httpcontext)?@Evk谢谢,我不知道。现在改成单身了@Tseng是的,正如图中所示,HttpContext
是空的:-至于你的第二个问题:我想是吗?当我启动我的网站时,错误会立即发生,但这会在我的浏览器中打开一个新选项卡,位置为localhost:50001
,我假设它是启动请求并触发断点的原因?
public class RouteService : BaseService
{
private IDictionary<int, string> _routeLanguages = null;
private readonly WebsiteRedisService _websiteRedisService;
public RouteService(IRepository db,
WebsiteSettings settings,
WebsiteRedisService websiteRedisService)
: base(db, settings)
{
_websiteRedisService = websiteRedisService;
}
public async Task<IDictionary<int, string>> RouteLanguagesAsync()
{
return _routeLanguages ??
(_routeLanguages = await _websiteRedisService.SiteLanguagesToAsync(Settings.SiteId));
}
}