wake-up-neo.com

.Net Core 2.1 - Kein Zugriff auf abgelegte Objekte möglich.Objektname: 'IServiceProvider'

Ich habe gerade .NET Core 2.0 auf .NET Core 2.1 umgestellt. Alles lief gut, aber wenn ich jetzt versuche mich einzuloggen, bekomme ich den folgenden Fehler:

  • $ exception {System.ObjectDisposedException: Kann nicht auf ein abgelegtes Objekt zugreifen . Objektname: 'IServiceProvider'.

Dies geschieht in diesem Code:

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;
    }

Es passiert in dieser Zeile:

var httpContextAccessor = _services.GetService<IHttpContextAccessor>();

Dies funktionierte auf .NET Core 2.0 

Ich habe versucht, die HttpContextAccessor zu meinem Startup hinzuzufügen, aber das hat nicht funktioniert.

Wie kann ich das beheben?

Lassen Sie mich wissen, wenn Sie mehr Code benötigen. Ich werde gerne mehr zur Verfügung stellen, aber ich weiß nicht, was Sie vielleicht brauchen oder nicht brauchen, deshalb habe ich nicht viel Code hinzugefügt. '

EDIT 

Ich habe services.AddHttpContextAccessor(); meinem Startup hinzugefügt, aber das scheint nicht zu funktionieren. Der Fehler wird immer noch angezeigt.

EDIT 2:

Full Stacktrace:

- $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
16
Luuk Wuijster

Ich würde das vorschlagen, anstatt zu rufen. services.GetService< IHttpContextAccessor>(), injizieren Sie IHttpContextAccessor in den Konstruktor und verwenden Sie ein Feld zum Speichern des Werts.

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

HttpContextAccessor muss auch manuell registriert werden . In RegisterServices in Startup.cs hinzufügen, services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

9
Code Name Jack

In meinem Fall war das Problem in Startup.cs

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

ersetzen Sie einfach services.GetService<>() durch app.ApplicationServices.GetService<>()

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

ich hoffe es hilft

9
Denis Olifer

Wenn Sie einen vorübergehenden Dienst erstellen, z. B. services.AddTransient ..., verfügt .net core über den Dienstanbieter. Dies ist ein Fehler ab .NET Core 2.2.

1
jjxtra

Bei mir funktioniert es mit:

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

und dann:

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

     ...

    }
1
user3198116

Ich könnte mir vorstellen, dass die IServiceProvider-Implementierung in einer using-Anweisung versehentlich irgendwo verwendet wurde oder völlig verworfen wurde.

Um zu testen, ob dies der Fall ist, können Sie versuchen, die IHttpContextAccessor direkt nach oder in der ConfigureServices-Methode aufzulösen.

Wenn es dort aufgelöst wird, müssen Sie schrittweise durchgehen, um herauszufinden, wo die IServiceProvider abgelegt wird.

0
Eben Roux