.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>()
, IHttpContextAccessor
将IHttpContextAccessor
注入构造函数并使用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
的处置位置。