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)
希望能帮助到你
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>();
如果您创建任何临时服务,例如 services.AddTransient...,则 .net core 将处置该服务提供者。这是 .net core 2.2 中的一个错误。
| 归档时间: |
|
| 查看次数: |
10699 次 |
| 最近记录: |