【问题标题】:Neo4jClient System.NullReferenceExceptionNeo4jClient System.NullReferenceException
【发布时间】:2016-09-01 00:58:28
【问题描述】:

有时在 Neo4jClient 中我收到此错误。我试图调查什么问题,但我没有找到任何原因。有没有人有同样的问题或者可以帮助我?

谢谢

{"Message":"发生错误。","ExceptionMessage":"对象引用未设置为对象的实例。","ExceptionType":"System.NullReferenceException","StackTrace":" at Neo4jClient.GraphClient.Neo4jClient.IRawGraphClient.ExecuteGetCypherResults[TResult](CypherQuery 查询)在 D:\temp\9517fa3\Neo4jClient.Shared\GraphClient.cs:line 919\r\n at Mandarim.Storage.Neo4j.Manager.ManagerBase1.GetNodesRelatedOrderBy(String match, String id, String relationNodeType, String propertyOrderBy, Int32 skip, Int32 take, Direction direction, Boolean distinct, Expression1 其中)在 P:\Desenvolvimento\branchs\builder-3.0\Mandarim.Storage.Neo4j\Manager\ManagerBase.cs:line 2105\r\n at Mandarim.Storage.Neo4j.Manager.ManagerBase1.GetNodesRelatedOrderBy(String id, Labels labelin, Labels labelout, String relationTypes, String propertyOrderBy, Int32 skip, Int32 take, Boolean distinct, Expression1 其中,方向方向)在 P:\Desenvolvimento\branchs\builder-3.0\Mandarim.Storage.Neo4j\Manager\ManagerBase.cs:line 900\r\n at Mandarim.Factory.Base.FactoryBase1.GetNodesRelatedOrderBy(String id, Labels labelin, Labels labelout, String relationTypes, String propertyOrderBy, Int32 skip, Int32 take, Boolean distinct, Expression1 其中,方向方向)在 P:\Desenvolvimento\branchs\builder-3.0\Mandarim.Factory\Base\FactoryBase.cs:line 177\r\n at PackDocs.Services.Storage.MandarimStorageServices1.GetNodesRelatedOrderBy(String id, Labels labelin, Labels labelout, String propertyOrderBy, Int32 skip, Int32 take, Boolean distinct, Expression1 where, Direction direction, RelationTypes[] relationNodeType) in P:\Desenvolvimento\branchs\builder-3.0\Packdocs.Services.Storage\MandarimStorageServices.cs:line 292\r\n 在 Mandarim.PackDocs.Services.ManagerObjects.ManagerProject.GetProjects(Int32 skip, Int32 take, String orderby, CreatedState state) 中 P:\Desenvolvimento\branchs\builder-3.0\PackDocs.Services\ManagerObjects\ManagerProject.cs:line 116\r\n 在 PackDocs.OWIN.Services.Host.Controllers.ProjectsController.GetProjects(Int32 在 P:\Desenvolvimento\branchs\builder-3.0\Packdocs.OWIN.Services.Host\Controllers\v2\ProjectsController.cs:line 103\r\n 中跳过、Int32 取、String orderby、CreatedState 状态 lambda_method(Closure , Object , Object[] )\r\n 在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.c__DisplayClass10.b__9(Object instance, Object[] methodParameters)\r\n 在 System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancelToken)\r\n--- 从先前引发异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n at System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext()\r\n--- 堆栈跟踪从上一个引发异常的位置结束---\r\n at 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 at 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.ThrowForNonSuccess(任务任务)\r\n 在 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;

第二个例外:

D:\temp\9517fa3\Neo4jClient.Full\Transactions\TransactionManager.cs:line 229 中的 Neo4jClient.Transactions.TransactionManager.EnqueueCypherRequest(字符串 commandDescription,IGraphClient graphClient,CypherQuery 查询) 在 D:\temp\9517fa3\Neo4jClient.Shared\GraphClient.cs:line 871 中的 Neo4jClient.GraphClient.PrepareCypherRequest[TResult](CypherQuery 查询,IExecutionPolicy 策略) 在 Neo4jClient.GraphClient.d__881.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.TaskAwaiter1.GetResult() 在 Mandarim.Storage.Neo4j.Manager.ManagerBase`1.d__113.MoveNext() 在 P:\Desenvolvimento\branchs\builder-3.0\Mandarim.Storage.Neo4j\Manager\ManagerBase.cs:line 2067

【问题讨论】:

  • 您好,您能提供您用来调用Neo4jClient 的代码以及您正在序列化的任何数据对象吗?没有这些东西很难调试(不可能)!
  • @ChrisSkardon 我用我的部分代码更新了我的问题。很奇怪,因为错误是随机发生的。但我大部分时间,是发生在第二次请求中。谢谢
  • @ChrisSkardon 我在同一案例中遇到的另一个例外。
  • @ChrisSkardon我发现了问题。我不知道为什么,但 TransactionContext 有时为空。在类 TransactionManager 方法 GetContext 中返回 nonDtcTransaction.TransactionContext;一片空白。你知道为什么这变成空了吗?

标签: neo4j neo4jclient


【解决方案1】:

当我们在这里使用带有多事务的异步 api 时会出现问题。 Neo4jClient 代码上的 [TreadStartic] 不适用于异步方法...所以我改用 AsyncLocal。

更多信息可以在这里:https://github.com/Readify/Neo4jClient/pull/209

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2013-07-30
    • 2014-11-01
    相关资源
    最近更新 更多