.Net Core 2.1 – 无法访问已处置的对象。对象名称:’IServiceProvider’

我刚刚将.NET Core 2.0迁移到.NET Core 2.1。 一切都很顺利,但是当我尝试登录时,我得到了以下错误:

  • $ exception {System.ObjectDisposedException:无法访问已处置的对象。 对象名称:’IServiceProvider’。

这发生在这段代码中:

public class AppContractResolver : DefaultContractResolver { private readonly IServiceProvider _services; public AppContractResolver(IServiceProvider services) { _services = services; } protected override IList CreateProperties(Type type, MemberSerialization memberSerialization) { var httpContextAccessor = _services.GetService(); var user = httpContextAccessor.HttpContext.User; List properies = base.CreateProperties(type, memberSerialization).ToList(); properies = FilterOneClaimGranted(type, properies, user); return properies; } 

它发生在这一行:

 var httpContextAccessor = _services.GetService(); 

这确实适用于.NET Core 2.0

我已经尝试将HttpContextAccessor添加到我的启动中,但这不起作用。

那么,我该如何解决这个问题呢?

如果您需要更多代码,请告诉我。 我很乐意提供更多,但我不知道你可能需要什么或不需要什么,所以我没有添加很多代码。

编辑

我添加了services.AddHttpContextAccessor(); 到我的创业公司,但这似乎不起作用。 仍然得到错误。

编辑2:

完整堆栈跟踪:

 - $exception {System.ObjectDisposedException: Cannot access a disposed object. Object name: 'IServiceProvider'. at Microsoft.Extensions.DependencyInjection.ServiceLookup.ThrowHelper.ThrowObjectDisposedException() at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider) at WebAPI.Extensions.AppContractResolver.CreateProperties(Type type, MemberSerialization memberSerialization) in C:\Users\luukw\Desktop\stage\blacky-api\Blacky\Extensions\Resolver\AppContractResolver.cs:line 25 at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateObjectContract(Type objectType) at Newtonsoft.Json.Serialization.DefaultContractResolver.CreateContract(Type objectType) at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) at Newtonsoft.Json.Serialization.DefaultContractResolver.ResolveContract(Type type) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.GetContractSafe(Type type) at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType) at Microsoft.AspNetCore.Mvc.Formatters.JsonInputFormatter.ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)} System.ObjectDisposedException 

我建议不要调用services.GetService< IHttpContextAccessor>()IHttpContextAccessorIHttpContextAccessor注入构造函数并使用aprivate字段来存储值。

 public AppContractResolver(IServiceProvider services, IHttpContextAccessor httpContextAccessor ) { _services = services; this.httpContextAccessor =httpContextAccessor ; } 

还必须手动注册HttpContextAccessor。 在Startup.cs中的RegisterServices中添加, services.AddSingleton();

在我的情况下,问题出在Startup.cs

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider services) { var svc = services.GetService(); // <-- exception here } 

只需用app.ApplicationServices.GetService<>()替换services.GetService<>() app.ApplicationServices.GetService<>()

 public void Configure(IApplicationBuilder app, IHostingEnvironment env) { var svc = app.ApplicationServices.GetService(); // no exception } 

希望能帮助到你

对我来说它适用于:

  public void ConfigureServices(IServiceCollection services) { … services.AddHttpContextAccessor(); … } 

然后:

  public void Configure(IApplicationBuilder app, IHttpContextAccessor accessor) { ... ...accessor.HttpContext.RequestService ... } 

我可以想象, IServiceProvider实现可能在某个地方无意中被用于using语句或被彻底处置。

要测试是否是这种情况,您可以尝试在ConfigureServices方法之后或之中解析IHttpContextAccessor

如果它在那里解析,你需要逐步找出IServiceProvider的处置位置。