【问题标题】:How Can I Fix this error : 'IFeatureCollection has been disposed. in Asp.net Core Mvc如何修复此错误:'IFeatureCollection 已被处置。在 Asp.net Core Mvc 中
【发布时间】:2021-10-20 04:55:51
【问题描述】:

如何修复此错误:'IFeatureCollection 已被释放。在 Asp.net Core Mvc 中

我使用 Filesystem Watcher 来获取 Path 中文件的事件数据 一切正常,我在数据库中发送了跟踪信息,但是当我尝试在 OnChanged 方法中使用它们时,它们是会话值的 Adminid 和 roleid 导致了这个问题

这是我的控制器:

 **public IActionResult RHManager()
        {
            ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
            ViewBag.RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString());
            var Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());



            FileSystemWatcher watcher = new FileSystemWatcher();

            //Mention the Path that you want to monitor file events.

            watcher.Path = @"\\100.100.1.6\drh-m$";
            watcher.IncludeSubdirectories = true;
            watcher.NotifyFilter = NotifyFilters.Attributes |
            NotifyFilters.CreationTime |
            NotifyFilters.DirectoryName |
            NotifyFilters.FileName |
            NotifyFilters.LastAccess |
            NotifyFilters.LastWrite |
            NotifyFilters.Security |
            NotifyFilters.Size;
            watcher.Filter = "*.*";
            //File System Events to listen them
            watcher.Changed += new FileSystemEventHandler(OnChanged);
            watcher.Created += new FileSystemEventHandler(OnChanged);
            watcher.Deleted += new FileSystemEventHandler(OnChanged);

            // Starting monitoring the folder.
            watcher.EnableRaisingEvents = true;

            return View(watcher);
        }


       

         void OnChanged(object source, FileSystemEventArgs e)
        {
            TraceFileManager trace = new TraceFileManager();
            trace.Time = DateTime.Now;
            trace.Adminid = int.Parse(HttpContext.Session.GetInt32("id").ToString());
            trace.Roleid = int.Parse(HttpContext.Session.GetInt32("id").ToString());
            trace.Changedfile = e.Name;
            trace.Seen = false;
            trace.Etat = "En attente";
            trace.Changetype = e.ChangeType.ToString();
            _context.Add(trace);
            
            _context.SaveChangesAsync();
        }**

【问题讨论】:

    标签: c# asp.net-core .net-core model-view-controller


    【解决方案1】:

    作用域服务在请求结束时被释放。 主要问题是OnChanged 可以在请求结束后调用。 当您需要请求之外的作用域服务时,您需要注入IServiceScopeFactory 并使用它来获取服务。

    同上,当 OnChanged 中调用属性 ControllerBase.HttpContext 时。 但是,不可能在请求之外获取 HttpContext。 然后,您需要在请求中从 HttpContext 获取信息并在OnChanged 调用中设置。

    public RhController : ControllerBase
    {
        private IServiceScopeFactory _serviceScopeFactory;
    
        public RhController(IServiceScopeFactory serviceScopeFactory)
        {
            _serviceScopeFactory = serviceScopeFactory;
        }
    
        public IActionResult RHManager()
        {
            ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
            ViewBag.RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString());
            var Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
            var IdRole = int.Parse(HttpContext.Session.GetInt32("id").ToString());
    
    
            FileSystemWatcher watcher = new FileSystemWatcher();
            ...
            //File System Events to listen them
            var fileSystemEventHandler = new FileSystemEventHandler((o, e) => OnChanged(e, Idadmin, IdRole));
            watcher.Changed += fileSystemEventHandler;
            watcher.Created += fileSystemEventHandler;
            watcher.Deleted += fileSystemEventHandler;
    
            // Starting monitoring the folder.
            watcher.EnableRaisingEvents = true;
    
            return View(watcher);
        }
    
        void OnChanged(FileSystemEventArgs e, int admin, int role)
        {
            using (var scope = serviceScopeFactory.CreateScope())
            {
                var context = scope.ServiceProvider.GetService<RhContext>();
    
                TraceFileManager trace = new TraceFileManager();
                trace.Adminid = admin;
                trace.Roleid = role;
                ...
    
                context.Add(trace);
                context.SaveChangesAsync();
            }
        }
    }
    

    【讨论】:

    • 我想念 HttpContext 是从 OnChanged 调用的......我编辑了我的答案。
    【解决方案2】:

    我尝试了您的解决方案,但问题仍然存在

    完整的控制器代码如下:

    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.DependencyInjection;
    using RoleBasedAuthorization.Models;
    using System;
    using System.Diagnostics;
    using System.IO;
    using System.Threading.Tasks;
    
    namespace RoleBasedAuthorization.Controllers
    {
        public class FileManagerController : Controller
        {
    
            ENAPORTALContext _context = new ENAPORTALContext();
            private readonly IServiceScopeFactory _serviceScopeFactory;
    
            public FileManagerController(IServiceScopeFactory serviceScopeFactory)
            {
                _serviceScopeFactory = serviceScopeFactory;
            }
            public IActionResult PQManager()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                return View();
            }
            public IActionResult FormulairesFManager()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                return View();
            }
            public IActionResult DGManager()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                return View();
            }
            public IActionResult DAFManager()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                ViewBag.RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString());
                return View();
            }
            public IActionResult DAPManager()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                ViewBag.RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString());
                return View();
            }
            public IActionResult DPCManager()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                ViewBag.RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString());
                return View();
            }
            public IActionResult DMVManager()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                ViewBag.RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString());
                return View();
            }
            public IActionResult PublicManager()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                return View();
            }
            public IActionResult DTManager()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                ViewBag.RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString());
                return View();
            }
            public IActionResult DTPManager()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                ViewBag.RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString());
                return View();
            }
            public IActionResult DTTManager()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                ViewBag.RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString());
                return View();
            }
            public IActionResult SMQManager()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                ViewBag.RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString());
                return View();
            }
            public IActionResult BoiteIdees()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                ViewBag.RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString());
    
                return View();
            }
    
          
    
    
            public IActionResult Documentation()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                ViewBag.RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString());
                return View();
            }
            public IActionResult DFManager()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                ViewBag.RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString());
                return View();
            }
            /*     FILE MANAGER DRH*/
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
            public IActionResult RHManager()
            {
                ViewBag.Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
                ViewBag.RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString());
                var Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());
    
    
    
                FileSystemWatcher watcher = new FileSystemWatcher();
    
                //Mention the Path that you want to monitor file events.
    
                watcher.Path = @"\\100.100.1.6\drh-m$";
                watcher.IncludeSubdirectories = true;
                watcher.NotifyFilter = NotifyFilters.Attributes |
                NotifyFilters.CreationTime |
                NotifyFilters.DirectoryName |
                NotifyFilters.FileName |
                NotifyFilters.LastAccess |
                NotifyFilters.LastWrite |
                NotifyFilters.Security |
                NotifyFilters.Size;
                watcher.Filter = "*.*";
                //File System Events to listen them
                watcher.Changed += new FileSystemEventHandler(OnChanged);
                watcher.Created += new FileSystemEventHandler(OnChanged);
                watcher.Deleted += new FileSystemEventHandler(OnChanged);
    
                // Starting monitoring the folder.
                watcher.EnableRaisingEvents = true;
    
                return View(watcher);
            }
    
    
           
    
             void OnChanged(object source, FileSystemEventArgs e)
            {
                using (var scope = _serviceScopeFactory.CreateScope())
                {
                    var context = scope.ServiceProvider.GetService<ENAPORTALContext>();
                    var Idadmin = int.Parse(HttpContext.Session.GetInt32("id").ToString());     /*Admin ID variable session will be inserted into db               error : IFeatureCollection has been disposed.*/
                    var RoleCreateur = int.Parse(HttpContext.Session.GetInt32("role_id").ToString()); /*role ID variable session will be inserted into db*/
                    TraceFileManager trace = new TraceFileManager();
                    trace.Time = DateTime.Now;
                    trace.Adminid = Idadmin;
                    trace.Roleid = RoleCreateur;
                    trace.Changedfile = e.Name;
                    trace.Seen = false;
                    trace.Etat = "En attente";
                    trace.Changetype = e.ChangeType.ToString();
                    _context.Add(trace);
    
                    _context.SaveChangesAsync();
                }
            }
    
    
        
    
    
    
    
    
    
    
    
    
    
        }
    }
    

    【讨论】:

    • 最好编辑问题以包含更多信息,例如重试。
    • 如果我的回答回答了你的问题,你能接受吗?
    猜你喜欢
    • 2016-08-18
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2020-07-04
    • 2022-01-07
    相关资源
    最近更新 更多