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# 如何在ASP.NET Core 1.0的DI中的Startup类中添加IHttpContextAccessor?_C#_Asp.net Core_Asp.net Core Mvc_Asp.net Core 1.0 - Fatal编程技术网

C# 如何在ASP.NET Core 1.0的DI中的Startup类中添加IHttpContextAccessor?

C# 如何在ASP.NET Core 1.0的DI中的Startup类中添加IHttpContextAccessor?,c#,asp.net-core,asp.net-core-mvc,asp.net-core-1.0,C#,Asp.net Core,Asp.net Core Mvc,Asp.net Core 1.0,在ASP.NET Core RC 1中,我使用以下代码检索上下文的值(页面的完整地址)。然后我在配置中记录了这个值 public class Startup { public IConfigurationRoot Configuration { get; set; } private IHostingEnvironment CurrentEnvironment { get; set; } private IHttpContextAccessor H

在ASP.NET Core RC 1中,我使用以下代码检索上下文的值(页面的完整地址)。然后我在配置中记录了这个值

public class Startup
{
        public IConfigurationRoot Configuration { get; set; }
        private IHostingEnvironment CurrentEnvironment { get; set; }
        private IHttpContextAccessor HttpContextAccessor { get; set; }
        public Startup(IHostingEnvironment env,
                IHttpContextAccessor httpContextAccessor)
            {                
                var builder = new ConfigurationBuilder()
                    .SetBasePath(env.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
    
                if (env.IsDevelopment())
                {
                    builder.AddUserSecrets();
                }
                builder.AddEnvironmentVariables();
                Configuration = builder.Build();
                CurrentEnvironment = env;
                HttpContextAccessor = httpContextAccessor;
            }
        public void ConfigureServices(IServiceCollection services)
        {
        ...
        
        services.AddOptions();
        services.Configure<WebAppSettings>(configuration);
        services.Configure<WebAppSettings>(settings =>
        {
            ...
            settings.WebRootPath = CurrentEnvironment.WebRootPath;
            settings.DomainUrl = HttpContextAccessor.HttpContext.Request.Host.ToUriComponent();
        });
        }
   }
公共类启动
{
公共IConfigurationRoot配置{get;set;}
私有IHostingEnvironment CurrentEnvironment{get;set;}
专用IHttpContextAccessor HttpContextAccessor{get;set;}
公共启动(IHostingEnvironment env,
IHttpContextAccessor(httpContextAccessor)
{                
var builder=new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile(“appsettings.json”,可选:true,重载更改:true)
.AddJsonFile($“appsettings.{env.EnvironmentName}.json”,可选:true);
if(env.IsDevelopment())
{
builder.AddUserSecrets();
}
builder.AddEnvironmentVariables();
Configuration=builder.Build();
CurrentEnvironment=env;
HttpContextAccessor=HttpContextAccessor;
}
public void配置服务(IServiceCollection服务)
{
...
services.AddOptions();
服务。配置(配置);
配置(设置=>
{
...
settings.WebRootPath=CurrentEnvironment.WebRootPath;
settings.DomainUrl=HttpContextAccessor.HttpContext.Request.Host.ToUriComponent();
});
}
}
现在我开始在ASP.NETCore1.0上更新项目。但在网站启动期间,我发现以下错误:

System.InvalidOperationException无法解析类型的服务 “Microsoft.AspNetCore.Http.IHttpContextAccessor”时尝试 激活“MyProject.Startup”

在 Microsoft.Extensions.Internal.ConstructorMatcher.CreateInstance(IServiceProvider 供应商)在 Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance(IServiceProvider 提供程序,类型instanceType,对象[]参数)位于 Microsoft.Extensions.Internal.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider 提供程序,类型)位于 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider 提供程序,类型)位于 Microsoft.AspNetCore.Hosting.Internal.StartupLoader.LoadMethods(IServiceProvider 服务,键入startupType,字符串environmentName)位于 Microsoft.AspNetCore.Hosting.c_uuuudisplayClass1_0.b_uuu1(IServiceProvider sp)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.FactoryService.Invoke(ServiceProvider 供应商)在 Microsoft.Extensions.DependencyInjection.ScopedCallSite.Invoke(ServiceProvider 供应商)在 Microsoft.Extensions.DependencyInjection.SingletonCallSite.Invoke(ServiceProvider 供应商)在 Microsoft.Extensions.DependencyInjection.c__DisplayClass12_0.b__0(ServiceProvider 供应商)在 Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(类型 服务类型)在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider 提供程序,键入serviceType)位于 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider 供应商)在 Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureStartup()位于 Microsoft.AspNetCore.Hosting.Internal.WebHost.EnsureApplicationServices() 在Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()上

.NET Framework X64 v4.0.30319.42000 | Microsoft.AspNetCore.Hosting 版本1.0.0-rtm-21431 | Microsoft Windows 6.1.7601 S


如何在应用程序启动期间获取新版本IHttpContextAccessor?

它不再是默认服务。您必须在Startup.cs中配置它

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();

来源:

您可以通过这种方式添加

services.AddSingleton();

如果查看.Net Core的重大更改,您会发现默认情况下不再注册
IHttpContextAccessor
。官方声明:添加依赖项
Startap.cs
并不能解决我的问题,因为类构造函数中必须使用
IHttpContextAccessor
。所以我在
Program.cs
中添加了一个依赖项,一个问题应该是
AddTransient
,因为它将用于请求吗?@Ruchan你得到过这个问题的答案吗?它应该是单态还是瞬态?@Reft我用的是单态。这里有更多关于这个问题的信息,请阅读davidfowl的答案
services.AddHttpContextAccessor();
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();