【发布时间】:2018-05-31 08:14:25
【问题描述】:
我刚刚将 .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;
}
它发生在这一行:
var httpContextAccessor = _services.GetService<IHttpContextAccessor>();
这确实适用于 .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
【问题讨论】:
-
只是想查一下,你是不是用.net core 2.1的方式注册了
services.AddHttpContextAccessor(); -
我已经尝试添加它,但没有奏效。仍然有同样的错误
-
而不是调用 AddHttpContextAccessor 尝试手动注册它,在我的情况下有所帮助: services.AddSingleton
() -
@Vitaly 不,不起作用:(
-
你应该尽量避免将
IServiceProvider传递给你的类,而是传递你需要使用的实际东西。它解决了一些边缘情况(比如你的情况),并且可以更容易地查看你的类实际使用的依赖项。
标签: c# asp.net .net asp.net-core