.Net Core 2.1 - 无法访问已处置的对象.对象名称:'IServiceProvider'

Luu*_*ter 19 .net c# asp.net asp.net-core

我刚刚将.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<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        var httpContextAccessor = _services.GetService<IHttpContextAccessor>();
        var user = httpContextAccessor.HttpContext.User;

        List<JsonProperty> properies = base.CreateProperties(type, memberSerialization).ToList();

        properies = FilterOneClaimGranted(type, properies, user);

        return properies;
    }
Run Code Online (Sandbox Code Playgroud)

它出现在这一行:

var httpContextAccessor = _services.GetService<IHttpContextAccessor>();
Run Code Online (Sandbox Code Playgroud)

这确实适用于.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
Run Code Online (Sandbox Code Playgroud)

Den*_*fer 12

在我的情况下问题是在 Startup.cs

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider services)
{
   var svc = services.GetService<IService>(); // <-- exception here
}
Run Code Online (Sandbox Code Playgroud)

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

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
   var svc = app.ApplicationServices.GetService<IService>(); // no exception
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你

  • 天哪:“app.ApplicationServices”是最令人惊奇的发现!感谢您的建议,使我节省了更多时间继续研究、试验和错误。 (2认同)

Cod*_*ack 10

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

public AppContractResolver(IServiceProvider services, 
                             IHttpContextAccessor  httpContextAccessor )
{
   _services = services;
   this.httpContextAccessor =httpContextAccessor ;
}
Run Code Online (Sandbox Code Playgroud)

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

  • @MatanShahar 仅供参考,答案已更新,现在包含正确信息。 (2认同)

jjx*_*tra 6

如果您创建任何临时服务,例如 services.AddTransient...,则 .net core 将处置该服务提供者。这是 .net core 2.2 中的一个错误。

  • 有这个问题的 Github 链接吗? (12认同)