.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<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(); к моему запуску, но это, похоже, не работает. Все еще получаю ошибку.

EDIT 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

Ответы

Ответ 1

Я бы предположил, что вместо вызова services.GetService< IHttpContextAccessor>(), введите IHttpContextAccessor в конструктор и используйте поле aprivate для сохранения значения.

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

Также HttpContextAccessor должен быть зарегистрирован вручную. В RegisterServices в Startup.cs add, services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

Ответ 2

В моем случае проблема была в Startup.cs

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

просто замените services.GetService<>() на app.ApplicationServices.GetService<>()

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

Надеюсь, поможет

Ответ 3

Для меня это работает с:

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

а потом:

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

     ...

    }

Ответ 4

Если вы создаете какую-либо временную службу, например services.AddTransient..., ядро .net будет располагать поставщиком услуг. Это ошибка с .net core 2.2.

Ответ 5

Я бы предположил, что реализация IServiceProvider возможно, использовалась в операторе using случайно где-то или была удалена прямо.

Чтобы проверить, если это так, вы можете попытаться разрешить IHttpContextAccessor сразу после или в методе ConfigureServices.

Если он разрешится, вам нужно будет пройти, чтобы узнать, где находится IServiceProvider.

Ответ 6

У меня похожая проблема с приложением (esims), написанным в .Net, и программисты сказали, что ему нужен .Net 2, сейчас у нас на работе много компьютеров, которые работают с windows 7, & 10 Pro без проблем, но на моем ноутбуке с новой установленной Windows 10 Pro и после всех обновлений и всех настроек, установленных в Программах, для активации .Net 3.5 Framework (включая .Net 2 и 3) он не отображает мне отчеты, Приложение запускается корректно, загружает базу данных, но когда я запрашиваю отчет, говорится:

    See the end of this message for details on invoking 
        just-in-time (JIT) debugging instead of this dialog box.

        ************** Exception Text **************
        System.ObjectDisposedException: Cannot access a disposed object.
        Object name: 'ReportViewer'.
           at Microsoft.Reporting.WinForms.ReportViewer.get_CurrentReport()
           at Microsoft.Reporting.WinForms.ReportViewer.Clear()
        at Microsoft.Reporting.WinForms.ReportViewer.RefreshReport(Int32 targetPage,                         PostRenderArgs postRenderArgs)
   at Microsoft.Reporting.WinForms.ReportViewer.RefreshReport()
   at Universum_Client.ReportForms.frmPrev.YVA4YnrEuQZ(Object  , EventArgs  )
   at System.EventHandler.Invoke(Object sender, EventArgs e)
   at System.Windows.Forms.Form.OnLoad(EventArgs e)
   at System.Windows.Forms.Form.OnCreateControl()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.WmShowWindow(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ContainerControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WmShowWindow(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.9148 (WinRelRS6.050727-9100)
    CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
eSims
    Assembly Version: 1.0.7102.22332
    Win32 Version: 1.0.7102.22332
    CodeBase: file:///C:/Program%20Files%20(x86)/UAIC/eSIMS/eSims.exe
----------------------------------------
MessageBoxGC
    Assembly Version: 1.0.6904.25481
    Win32 Version: 1.0.7102.22332
    CodeBase: file:///C:/Program%20Files%20(x86)/UAIC/eSIMS/eSims.exe
----------------------------------------
System.Windows.Forms
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.9136 (WinRelRS6.050727-9100)
    CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.9147 (WinRelRS6.050727-9100)
    CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.9136 (WinRelRS6.050727-9100)
    CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
Accessibility
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.9136 (WinRelRS6.050727-9100)
    CodeBase: file:///C:/Windows/assembly/GAC_MSIL/Accessibility/2.0.0.0__b03f5f7f11d50a3a/Accessibility.dll
----------------------------------------
Universum_Library
    Assembly Version: 1.0.7102.22323
    Win32 Version: 1.0.7102.22332
    CodeBase: file:///C:/Program%20Files%20(x86)/UAIC/eSIMS/eSims.exe
----------------------------------------
System.Runtime.Remoting
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.9136 (WinRelRS6.050727-9100)
    CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Runtime.Remoting/2.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
----------------------------------------
System.Configuration
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.9136 (WinRelRS6.050727-9100)
    CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.9136 (WinRelRS6.050727-9100)
    CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Data
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.9136 (WinRelRS6.050727-9100)
    CodeBase: file:///C:/Windows/assembly/GAC_32/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
Microsoft.ReportViewer.WinForms
    Assembly Version: 11.0.0.0
    Win32 Version: 11.0.3442.2 ((SQL11_SP1_RS_Dev12-RTM).140611-0541 )
    CodeBase: file:///C:/Program%20Files%20(x86)/UAIC/eSIMS/Microsoft.ReportViewer.WinForms.DLL
----------------------------------------
System.Core
    Assembly Version: 3.5.0.0
    Win32 Version: 3.5.30729.9135 built by: WinRelRS6
    CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Core/3.5.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
Microsoft.ReportViewer.Common
    Assembly Version: 11.0.0.0
    Win32 Version: 11.0.3442.2 ((SQL11_SP1_RS_Dev12-RTM).140611-0541 )
    CodeBase: file:///C:/Program%20Files%20(x86)/UAIC/eSIMS/Microsoft.ReportViewer.Common.DLL
----------------------------------------
System.Web.Services
    Assembly Version: 2.0.0.0
    Win32 Version: 2.0.50727.9136 (WinRelRS6.050727-9100)
    CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System.Web.Services/2.0.0.0__b03f5f7f11d50a3a/System.Web.Services.dll
----------------------------------------
dy61duv6
    Assembly Version: 11.0.0.0
    Win32 Version: 2.0.50727.9147 (WinRelRS6.050727-9100)
    CodeBase: file:///C:/Windows/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.

Теперь у меня нет навыков программирования. Пожалуйста, дайте мне прямой ответ и легко скопировать для исправления этой ошибки.

Заранее спасибо.