Я получаю эту ошибку, которую не понимаю, почему, используя NoRM и Mongo в моем проекте MVC - PullRequest
1 голос
/ 01 июля 2010

Невозможно получить доступ к удаленному объекту. Имя объекта: '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();
    }


}

И вызывающий код будет выглядеть примерно так: моя _сессия передается моему контроллеру в contrutor, использующем 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 () в Norm.Connection.GetStream () в Norm.Connection.Write (Byte [] bytes, Начало Int32, размер Int32) в Norm.Protocol.Messages.QueryMessage 2.Execute() at Norm.MongoQueryExecutor 3.d__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 1 источник) в Domain.Storage.MongoDB.MongoSession.Single [Т] (Выражение 1 expression) in C:\inetpub\wwwroot\DubeLoiselle\Domain\Storage\MongoDB\MongoSession.cs:line 21 at Domain.Storage.MongoDB.MongoRepositoryBase 1.Single (Выражение * 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)

Отредактировано снова:

Перед тем, как я получаю эту ошибку, я ловлю эту:

Невозможно записать данные в транспортное соединение: существующее соединение было принудительно закрыто удаленным хостом.

Трассировка стека: в System.Net.Sockets.NetworkStream.Write (буфер Byte [], смещение Int32, размер Int32) в Norm.Connection.Write (байты [], начало Int32, размер Int32) в Norm.Protocol .Messages.QueryMessage 2.Execute() at Norm.MongoQueryExecutor 3.d__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 1) в домене * 1.Single (Выражение 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.ControllerActionInvililTontInteContainerWinterWinterIntelerTimeIntoters (Invo). Параметры IList 1 filters, ActionDescriptor actionDescriptor, IDictionary 2) в System.Web.Mvc.ControllerActionInvoker.InvokeAction (ControllerContext controllerContext, String actionName)

Ответы [ 2 ]

0 голосов
/ 03 февраля 2011

Я нашел решение этой проблемы, я закрываю свой объект Session в моем контроллере в OnActionExecuted ()

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

Надеюсь, что это может помочь кому-то еще!

0 голосов
/ 03 февраля 2011

Это происходит из-за того, что базовый TcpClient был отключен от сервера.

Вы должны открыть соединение IMongo в последний момент, только чтобы запросить хранилище данных NoSQL и утилизировать его.Существует пул соединений, который поддерживает открытые соединения и удаляет неработающие соединения, чтобы снизить стоимость использования Mongo.Create.

Если открытое соединение будет слишком долгим, это вызовет проблемы, когда у вас будет много клиентов одновременно.

...