代码之家  ›  专栏  ›  技术社区  ›  VinnyG

我得到这个错误,我不明白为什么,在我的MVC项目中使用NoRM和Mongo

  •  1
  • VinnyG  · 技术社区  · 14 年前

    无法访问已释放的对象。 对象名称:“System.Net.Sockets.TcpClient”。

    我不明白为什么会这样,怎么处理。我使用Ninject,我的应用程序是基于mvcstarter.codeplex.com/我所做的是从我的数据库中删除一些用户或页面,并且它是无缘无故发生的(我可以找到)。

    任何帮助都将不胜感激!

    谢谢!

    另外,过了一段时间它恢复正常,我可以从Mongo获取我的数据。。。我的单元测试很好。。。

    以下是我的会话代码:

    public class MongoSession : ISession{
    
        private readonly Mongo _server;
    
        public MongoSession()
        {
            //this looks for a connection string in your Web.config - you can override this if you want
            _server = Mongo.Create("MongoDB");
        }
    
        public T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class {
            return _server.GetCollection<T>().AsQueryable().Where(expression).SingleOrDefault();
        }
    
        public IQueryable<T> All<T>() where T : class {
            return _server.GetCollection<T>().AsQueryable();
        }
    
        /*public void Add<T>(T item) where T : class {
            _provider.DB.GetCollection<T>().Insert(item);
        }*/
    
        public void Save<T>(IEnumerable<T> items) where T : class {
            foreach (T item in items) {
                Save(item);
            }
        }
    
        public void Save<T>(T item) where T : class {
            var errors = DataAnnotationsValidationRunner.GetErrors(item);
            if (errors.Count() > 0)
            {
                throw new RulesException(errors);
            }
            _server.Database.GetCollection<T>().Save(item);
        }
    
        //this is just some sugar if you need it.
        /*public T MapReduce<T>(string map, string reduce) {
            T result = default(T);
            using (MapReduce mr = _provider.Server.CreateMapReduce()) {
                MapReduceResponse response =
                    mr.Execute(new MapReduceOptions(typeof(T).Name) {
                                                                        Map = map,
                                                                        Reduce = reduce
                                                                    });
                MongoCollection<MapReduceResult<T>> coll = response.GetCollection<MapReduceResult<T>>();
                MapReduceResult<T> r = coll.Find().FirstOrDefault();
                result = r.Value;
            }
            return result;
        }*/
    
        public void Delete<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class
        {
            var items = All<T>().Where(expression);
            foreach (T item in items)
            {
                Delete(item);
            }
        }
    
        public void Delete<T>(T item) where T : class
        {
            _server.GetCollection<T>().Delete(item);
        }
    
        public void Drop<T>() where T : class
        {
            _server.Database.DropCollection(typeof(T).Name);
    
        }
    
        /*public void CommitChanges()
        {
            //mongo isn't transactional in this way... it's all firehosed
        }*/
    
        public void Dispose() {
            _server.Dispose();
        }
    
    
    }
    

    调用代码是这样的,我的会话通过Ninject传递给我的控制器,绑定在my global.cs中:

    Bind<ISession>().To<MongoSession>().InSingletonScope();
    
    
    
    public virtual ActionResult Liens()
        {
            var shortcutLionks = _session.All<ShortcutLinks>().ToList();
            ViewData.Model = shortcutLionks.Count > 0 ? shortcutLionks[0] : new ShortcutLinks();
            return View();
        }
    

    编辑时间:

    以下是我的错误细节:

    在Norm.Connection.GetStream()处 Int32开始,Int32大小) Norm.Protocol.Messages.query消息 2.Execute() at Norm.MongoQueryExecutor 3.d\u 0.MoveNext() 在 System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable) 1 source) at Norm.Linq.MongoQueryExecutor.Execute[T]() at Norm.Linq.MongoQueryProvider.ExecuteQuery[T](Expression expression) at Norm.Linq.MongoQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable (来源) Domain.Storage.MongoDB.MongoSession.Single[T](表达式) 1 expression) in C:\inetpub\wwwroot\DubeLoiselle\Domain\Storage\MongoDB\MongoSession.cs:line 21 at Domain.Storage.MongoDB.MongoRepositoryBase 1.单个(表达式) 1 expression) in C:\inetpub\wwwroot\DubeLoiselle\Domain\Storage\MongoDB\MongoRepositoryBase.cs:line 26 at SPK.CMS.Domain.Repository.PageRepository.GetHomePage() in C:\inetpub\wwwroot\DubeLoiselle\SPK.CMS.Domain\Repository\PageRepository.cs:line 146 at Web.Controllers.PageController.Home() in C:\inetpub\wwwroot\DubeLoiselle\Web\Controllers\PageController.cs:line 26 at Web.Controllers.PageController.RedirectTo(String url1, String url2, String url3) in C:\inetpub\wwwroot\DubeLoiselle\Web\Controllers\PageController.cs:line 50 at lambda_method(ExecutionScope , ControllerBase , Object[] ) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary 2 参数)在 操作描述符,IDictionary 2 parameters) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.b__a() at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func 1)在 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext 控制器上下文,IList 1 filters, ActionDescriptor actionDescriptor, IDictionary 2)参数 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,字符串actionName)

    再次编辑:

    在我得到这个错误之前,我捕获了这个错误:

    无法将数据写入传输连接:远程主机已强制关闭现有连接。

    堆栈跟踪:位于System.Net.Sockets.NetworkStream.Write(Byte[]buffer,Int32 offset,Int32 size)at Norm.Connection.Write(Byte[]bytes,Int32 start,Int32 size)at Norm.Protocol.Messages.QueryMessage 2.Execute() at Norm.MongoQueryExecutor 1 source) at Norm.Linq.MongoQueryExecutor.Execute[T]() at Norm.Linq.MongoQueryProvider.ExecuteQuery[T](Expression expression) at Norm.Linq.MongoQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable 1 expression) in C:\inetpub\wwwroot\DubeLoiselle\Domain\Storage\MongoDB\MongoSession.cs:line 21 at Domain.Storage.MongoDB.MongoRepositoryBase 1.单个(表达式) 1 expression) in C:\inetpub\wwwroot\DubeLoiselle\Domain\Storage\MongoDB\MongoRepositoryBase.cs:line 26 at SPK.CMS.Domain.Repository.PageRepository.GetHomePage() in C:\inetpub\wwwroot\DubeLoiselle\SPK.CMS.Domain\Repository\PageRepository.cs:line 146 at SPK.CMS.Domain.Repository.PageRepository.GetByUrl(String url1, String url2, String url3) in C:\inetpub\wwwroot\DubeLoiselle\SPK.CMS.Domain\Repository\PageRepository.cs:line 195 at Web.Controllers.PageController.RedirectTo(String url1, String url2, String url3) in C:\inetpub\wwwroot\DubeLoiselle\Web\Controllers\PageController.cs:line 52 at lambda_method(ExecutionScope , ControllerBase , Object[] ) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary 2个参数)位于System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext ControllerContext,ActionDescriptor ActionDescriptor,IDictionary 2 parameters) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.b__a() at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func 1)在System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext ControllerContext,IList 1 filters, ActionDescriptor actionDescriptor, IDictionary 2个参数)位于System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext ControllerContext,String actionName)

    2 回复  |  直到 14 年前
        1
  •  0
  •   Nekresh Strawberry    14 年前

    发生这种情况是因为底层TcpClient已与服务器断开连接。

    IMongo 连接,只查询NoSQL数据存储并处理它。有一个连接池,它可以保持连接处于打开状态,并删除死连接以降低使用成本 Mongo.Create .

        2
  •  0
  •   VinnyG    14 年前

    我找到了解决这个问题的方法,在OnActionExecuted()中关闭控制器中的会话对象

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            _session.Dispose();
            base.OnActionExecuted(filterContext);
        }
    

    希望它能帮助别人!

    推荐文章