1

破棄されたオブジェクトにアクセスできません。オブジェクト名:'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();
    }


}

そして、呼び出し元のコードは次のようになります。私の_sessionは、Ninjectを使用して、コンストラクターのコントローラーに渡されます。バインディングは、私の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()at Norm.Connection.GetStream()at Norm.Connection.Write(Byte [] bytes、Int32 start、Int32 size)at Norm.Protocol.Messages.QueryMessage 2.Execute() at Norm.MongoQueryExecutor3 .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](IQueryable1 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.MongoRepositoryBase1.Single(Expression 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, IDictionary2 parameters)atSystem.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, Func1 continuation)at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext、IList1 filters, ActionDescriptor actionDescriptor, IDictionary2つのパラメーター)System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext、String actionName)

再度編集:

このエラーが発生する前に、これをトラップします。

トランスポート接続にデータを書き込めません:既存の接続がリモートホストによって強制的に閉じられました。

スタックトレース:System.Net.Sockets.NetworkStream.Write(Byte []バッファー、Int32オフセット、Int32サイズ)、Norm.Connection.Write(Byte []バイト、Int32開始、Int32サイズ)、Norm.Protocol.Messages。 QueryMessage 2.Execute() at Norm.MongoQueryExecutor3.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](IQueryable1 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.MongoRepositoryBase1.Single(Expression 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, IDictionary2 parameters)atSystem。 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, Func1 continuation)at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext、IList1 filters, ActionDescriptor actionDescriptor, IDictionary2つのパラメーター)System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext、String actionName)

4

2 に答える 2

0

これは、基盤となるTcpClientがサーバーから切断されているために発生します。

最後に接続を開いてIMongo、NoSQLデータストアにクエリを実行して破棄する必要があります。接続を開いたままにし、デッド接続を削除して使用コストを削減する接続プールがありますMongo.Create

接続を長時間開いたままにしておくと、同時に多数のクライアントが存在する場合に問題が発生します。

于 2011-02-03T10:04:56.453 に答える
0

この問題の解決策を見つけました。OnActionExecuted() でコントローラーの Session オブジェクトを閉じます。

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

それが他の誰かに役立つことを願っています!

于 2011-02-03T16:18:55.477 に答える