代码之家  ›  专栏  ›  技术社区  ›  Jeferson dos Anjos

Neo4j客户端系统完整引用异常

  •  0
  • Jeferson dos Anjos  · 技术社区  · 9 年前

    在Neo4jClient中,有几次我遇到了这个错误。我试图调查出了什么问题,但没有找到任何原因。有没有人有同样的问题或者可以帮我?

    谢谢

    {“消息”:“发生错误。”,“ExceptionMessage”:“对象引用未设置为对象实例。”,”ExceptionType“:”System.NullReferenceException“,”StackTrace“:”位于 Neo4jClient.GraphClient.Neo4jClient.IRawGraphClient。在D:\temp\9517fa3\Neo4jClient.Shared\GraphClient中执行GetCypherResults[TResult](CypherQuery查询)。cs:line 919\r\n位于 Mandarim.存储.Neo4j.管理员.管理员库 1.GetNodesRelatedOrderBy(String match, String id, String relationNodeType, String propertyOrderBy, Int32 skip, Int32 take, Direction direction, Boolean distinct, Expression 1其中)位于P:\Desenvolvimento\branchs\builder-3.0\Mandarim.Storage.Neo4j\Manager\ManagerBase中。cs:line 2105\r\n位于 Mandarim.存储.Neo4j.管理员.管理员库 1.GetNodesRelatedOrderBy(String id, Labels labelin, Labels labelout, String relationTypes, String propertyOrderBy, Int32 skip, Int32 take, Boolean distinct, Expression 其中,方向)位于P:\Desenvolvimento\branchs\builder-3.0\Mandarim.Storage。Neo4j\Manager\ManagerBase。cs:line 900\r\n位于 Mandarim.Factory.Base.FactoryBase公司 1.GetNodesRelatedOrderBy(String id, Labels labelin, Labels labelout, String relationTypes, String propertyOrderBy, Int32 skip, Int32 take, Boolean distinct, Expression 其中,方向)位于P:\Desenvolvimento\branchs\builder-3.0\Mandarim.Factory\Base\FactoryBase。cs:line 177\r\n位于 PackDocs.Services.Storage.Mandarim存储服务 1.GetNodesRelatedOrderBy(String id, Labels labelin, Labels labelout, String propertyOrderBy, Int32 skip, Int32 take, Boolean distinct, Expression 1其中,Direction Direction,RelationTypes[]relationNodeType)位于P:\Desenvolvimento\branchs\builder-3.0\Packdocs.Services.Storage\MandarimStorageServices中。cs:第292行\r\n
    位于Mandarim.PackDocs.Services.ManagerObjects.ManagerProject。GetProjects(Int32 skip、Int32 take、String orderby、CreatedState状态)在 P: \Desenvolvimento\branchs\builder-3.0\PackDocs.Services\ManagerObjects\ManagerProject。cs:line 116\r\n位于PackDocs.OWIN.Services.Host.Controllers.ProjectsController.GetProjects(Int32 skip、Int32 take、String orderby、CreatedState状态)。cs:line 103\r\n位于 lambda_method(闭包,对象,对象[])\r\n位于System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c_DisplayClass10.b_9(对象实例,对象[] methodParameters)\r\n位于System.Web.Http.Controllers.ReflectedHttpActionDescriptor。ExecuteAsync(HttpControllerContext控制器上下文,IDictionary`2参数,CancellationToken cancellationToken)\r\n---来自引发异常的前一位置的堆栈跟踪结束---\r\n位于System.Runtime.CompilerServices.TaskAwaiter。ThrowForNonSuccess(任务任务)\r\n时间 System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()\r\n---上一个引发异常的位置的堆栈跟踪结束---\r\n System.Runtime.CompilerServices.TaskAwaiter。ThrowForNonSuccess(任务任务)\r\n位于System.Runtime.CompilerServices.TaskAwaiter。HandleNonSuccessAndDebuggerNotification(任务任务)\r\n位于 System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()\r\n---上一个引发异常的位置的堆栈跟踪结束---\r\n System.Runtime.CompilerServices.TaskAwaiter。ThrowForNonSuccess(任务任务)\r\n位于System.Runtime.CompilerServices.TaskAwaiter。HandleNonSuccessAndDebuggerNotification(任务任务)\r\n位于 System.Web.Http.Filters.AuthorizationFilterAttribute.d__2.MoveNext()\r\n---来自引发异常的前一位置的堆栈跟踪结束 ---\\r\n位于System.Runtime.CompilerServices.TaskAwaiter。System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)\r\n位于System.Web.Http.Dispatcher.HttpControllerDispatcher\d__1.MoveNext()“}

    使现代化

                ContainerBuilder _builder = new ContainerBuilder();
    
                _builder
                .Register<ITransactionalGraphClient>(context =>
                {
                    try
                    {
                        var neo4jUri = GetNeo4jSettingValue("neo4jUri");
                        var user = GetNeo4jSettingValue("neo4jUser");
                        var pwd = GetNeo4jSettingValue("neo4jPassword");
                        ITransactionalGraphClient graphClient = new GraphClient(new Uri(neo4jUri), user, pwd);
                        graphClient.Connect();
                        graphClient.JsonConverters.Add(new DictionaryConverter());
                        graphClient.JsonConverters.Add(new DateTimeConverter());
                        graphClient.JsonConverters.Add(new CommonDeserializerMethods());
    
    
                        return graphClient;
                    }
                    catch (Exception e)
                    {
                        Trace.TraceError(e.ToString());
                        throw e;
                    }
                }).SingleInstance();
    
                _container = _builder.Build();
    

    获取实例

               try
                {
                    _myGraphClient = _myGraphClient ?? AutofacNeo4j.Container.Resolve<ITransactionalGraphClient>();
                    if (_myGraphClient != null && !_myGraphClient.IsConnected)
                        _myGraphClient.Connect();
                    return _myGraphClient;
                }
                catch (Exception e)
                {
                    Trace.TraceError(e.ToString());
                    _myGraphClient = _myGraphClient ?? AutofacNeo4j.Container.Resolve<ITransactionalGraphClient>();
                    _myGraphClient.Connect();
                    return _myGraphClient;
                }
    

    我的查询:

                         MyGraphClient.Cypher
                        .Match(match).Where((T a) => a.UUID == id)
                        .With("b")
                        .CurrentUser(CurrentUsername)
                        .WhereReadClause("b", GetDomainsClause("b"),       CurrentUsername, CurrentRole, direction)
                        .Return(b => b.As<T>()).Results;
    

    第二个例外:

    Neo4jClient.Transactions.TransactionManager。D:\temp\9517fa3\Neo4jClient.Full\Transactions\TransactionManager中的EnqueueCypherRequest(String commandDescription、IGraphClient graphClient、CypherQuery查询)。cs:第229行 位于Neo4jClient.GraphClient。D:\temp\9517fa3\Neo4jClient.Shared\GraphClient中的PrepareCypherRequest[TResult](CypherQuery查询,IExecutionPolicy策略)。cs:第871行 在Neo4jClient.GraphClient.d__88 1.MoveNext() in D:\temp\9517fa3\Neo4jClient.Shared\GraphClient.cs:line 967 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter 1.获取结果() 位于P:\Desenvolvimento\branchs\builder-3.0\Mandarim.Storage.Neo4j.Manager.ManagerBase`1.d__113.MoveNext()。cs:2067行

    1 回复  |  直到 9 年前
        1
  •  0
  •   Jeferson dos Anjos    9 年前

    当我们在这里对多事务使用异步api时,就会出现问题。 Neo4jClient代码上的[TreadStartic]不能很好地与异步方法配合使用……所以我改为使用AsyncLocal。

    更多信息请点击此处: https://github.com/Readify/Neo4jClient/pull/209