Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 注入后IHttpContextAccessor为空_C#_Asp.net Core_Httpcontext - Fatal编程技术网

C# 注入后IHttpContextAccessor为空

C# 注入后IHttpContextAccessor为空,c#,asp.net-core,httpcontext,C#,Asp.net Core,Httpcontext,我目前正在开发一个系统,根据来自不同网站设置的请求所属的域,需要加载(例如,默认语言id),然后在应用程序的其余部分中使用。这些设置存储在一个类WebsiteSettings中,在需要时将其注入应用程序的其余部分 我尝试的第一个选项是在我的ConfigureServices方法中注册服务以访问HttpContext: public void ConfigureServices(IServiceCollection services) { //Register other services

我目前正在开发一个系统,根据来自不同网站设置的请求所属的域,需要加载(例如,默认语言id),然后在应用程序的其余部分中使用。这些设置存储在一个类
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));
    }
}