使用Gremlin.Net调用AWS Neptune时遇“Message with op code [close] is not recognized”错误
问题分析与解决
你的代码确实存在问题——不该把GraphTraversal实例放在using块中。
问题根源
query.Project<string>("resourceId")返回的是GraphTraversal对象,它虽然实现了IDisposable接口,但这个Dispose方法是用来清理本地遍历的临时资源,而非关闭和Neptune的连接。当代码离开using块时,会自动调用Dispose(),此时Gremlin.Net会尝试向Neptune服务器发送一个close操作码,但AWS Neptune的Gremlin端点并不支持这个操作,所以触发了"Message with op code [close] is not recognized"错误。
修正后的代码
直接移除using块即可,因为Promise(x => x.ToList())执行完成后,请求相关的资源已经被正确处理:
var query = graph.V().Values<string>("resourceId").Dedup(); var uniqueResourceIds = query.Project<string>("resourceId"); var queryResult = await uniqueResourceIds.Promise(x => x.ToList());
补充说明
如果需要管理Gremlin连接的生命周期,应该操作的是GraphClient或Cluster实例(如果你用的是Cluster模式),而不是单个的GraphTraversal对象。这些顶层的客户端/集群对象才是需要用using块来释放连接资源的正确对象。
内容的提问来源于stack exchange,提问作者S7H
相关产品推荐
相关产品推荐

