2010-07-01 87 views
1

無法訪問處置的對象。 對象名稱:'System.Net.Sockets.TcpClient'。我得到這個錯誤,我不明白爲什麼,在我的MVC項目中使用NoRM和Mongo

我不明白爲什麼會發生,以及如何處理它。我使用Ninject,我的應用程序基於mvcstarter.codeplex.com/。我所做的是從我的數據庫中刪除一些用戶或頁面,並且無緣無故發生(我可以找到)。

任何幫助,將不勝感激!

非常感謝!

*編輯 此外,一段時間後,它恢復正常,我可以從蒙戈獲取我的數據...我的單元測試,做工精細...

這是我爲我的會議代碼:

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(); 
    } 


} 

,並且調用的代碼會是這樣的,我是_session傳遞給我的控制器使用Ninject的contrutor,在我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(); 
    } 

編輯:

這裏是我的錯誤的細節:

堆棧跟蹤:在 System.Net.Sockets.TcpClient.GetStream() 在Norm.Connection.GetStream()在 Norm.Connection .WRITE(字節[]字節, 的Int32開始,的Int32大小)在 Norm.Protocol.Messages.QueryMessage 2.Execute() at Norm.MongoQueryExecutor 3.d__0.MoveNext() 在 System.Linq.Enumerable.SingleOrDefault [TSource](IEnumerable的源)在 Domain.Storage.MongoD B.MongoSession.Single [T](表達式1 expression) in C:\inetpub\wwwroot\DubeLoiselle\Domain\Storage\MongoDB\MongoSession.cs:line 21 at Domain.Storage.MongoDB.MongoRepositoryBase 1.單(在 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續)在 系統。 Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext,IList的1 filters, ActionDescriptor actionDescriptor, IDictionary 2參數)在 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,字符串actionName)

再次編輯:

之前,我得到這個錯誤我這個陷阱之一:

無法將數據寫入傳輸連接:一個現有的連接被強行關閉遠程主機。

堆棧跟蹤:在Norm.Norm.Connection.Write(Byte [] bytes,Int32 start,Int32 size)在System.Net.Sockets.NetworkStream.Write(Byte []緩衝區,Int32偏移量,Int32大小)。 Protocol.Messages.QueryMessage 2.Execute() at Norm.MongoQueryExecutor 3.d__0.MoveNext()at 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 1 source)at Domain.Storage.MongoDB.MongoSession.Single [T](Expression 1 expression) in C:\inetpub\wwwroot\DubeLoiselle\Domain\Storage\MongoDB\MongoSession.cs:line 21 at Domain.Storage.MongoDB.MongoRepositoryBase 1。系統上System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext,IList 1 filters, ActionDescriptor actionDescriptor, 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 continuation)單個(表達式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參數) .Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,String actionName)

+0

代碼或它沒有發生。 – jfar 2010-07-01 17:37:55

+0

也需要調用代碼。 – jfar 2010-07-01 18:36:49

+0

任何人都有想法?在IIS應用程序池回收後,它恢復正常。 – VinnyG 2010-07-22 20:31:17

回答

0

我找到了一個解決這個問題,我閉上Session對象在我的控制器在OnActionExecuted()

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

希望它可以幫助別人!

0

發生這種情況的原因是基礎TcpClient已從服務器斷開連接。

您應該在最後一刻打開IMongo連接,僅查詢NoSQL數據存儲並進行處置。有一個連接池可以保持連接打開並刪除無效連接以降低使用Mongo.Create的成本。

保持連接打開時間過長會在您同時擁有多個客戶端時導致問題。

+0

我正在使用Ninject,我認爲它應該爲我處理連接?我基於我的項目[來自Rob的mvc starter網站](http://mvcstarter.codeplex.com/) – VinnyG 2011-02-03 16:13:48

相關問題