.net 如何使用EventStore嵌入式客户端?

.net 如何使用EventStore嵌入式客户端?,.net,database,eventstoredb,.net,Database,Eventstoredb,似乎没有关于如何使用EventStore.client.Embedded nuget包设置、运行和连接嵌入式EventStore客户端的文档。使用以下代码: ClusterVNode node = EmbeddedVNodeBuilder .AsSingleNode() .RunInMemory() .OnDefaultEndpoints() .Build(); var connection = EmbeddedEventStoreConnection.Crea

似乎没有关于如何使用EventStore.client.Embedded nuget包设置、运行和连接嵌入式EventStore客户端的文档。使用以下代码:

ClusterVNode node = EmbeddedVNodeBuilder
    .AsSingleNode()
    .RunInMemory()
    .OnDefaultEndpoints()
    .Build();

var connection = EmbeddedEventStoreConnection.Create(node);
await connection.ConnectAsync();
var sampleEventData = new EventData(Guid.NewGuid(), "myTestEvent", false, new byte[] { 6, 10, 15 }, null);
WriteResult writeResult = await connection.AppendToStreamAsync("sampleStream, ExpectedVersion.NoStream, sampleEventData);
AppendToStreamAsync
行之前,一切似乎都正常工作,该行引发以下异常:

预期EventStore.Core.Messages.ClientMessage+WriteEventsCompleted的响应,收到EventStore.Core.Messages.ClientMessage+NotHandled


为了避开这个例外,魔法咒语缺少了哪一部分?

这里缺少了两件事。首先,使用嵌入式eventstore客户端时,必须启动节点:

node.Start();
其次,您必须等待节点成为主节点,然后才能使用连接。
ClusterVNode
有一个名为
NodeStatusChanged
的事件,您可以侦听该事件并找出何时存在主节点。以下方面应起作用:

ClusterVNode node = EmbeddedVNodeBuilder
    .AsSingleNode()
    .RunInMemory()
    .OnDefaultEndpoints()
    .Build();

bool isNodeMaster = false;
node.NodeStatusChanged += (sender, args) => {
    isNodeMaster = args.NewVNodeState == VNodeState.Master;
};
node.Start();

var stopwatch = new Stopwatch();
stopwatch.Start();
while (!isNodeMaster) {
    if (stopwatch.Elapsed.Seconds > 20) {
        throw new InvalidOperationException(
        "Waited too long (20 seconds) for EventStore node to become master.");
    }
    Thread.Sleep(1);
}
stopwatch.Stop();

var connection = EmbeddedEventStoreConnection.Create(node);
await connection.ConnectAsync();
var sampleEventData = new EventData(Guid.NewGuid(), "myTestEvent", false, new byte[] { 6, 10, 15 }, null);
WriteResult writeResult = await connection.AppendToStreamAsync("sampleStream, ExpectedVersion.NoStream, sampleEventData);
秒表之类的东西不是必需的,但在出现问题且节点永远不会成为主节点时,它有助于打破
while
循环

如果在事件处理程序委托中放置一个断点,您将注意到
节点
通过3个
VNodeState
s。首先是
VNodeState.Unknown
,然后是
VNodeState.PreMaster
,最后是
VNodeState.Master


在创建连接并对其调用
ConnectAsync()
之前,您不需要等待节点成为主节点。但是,您需要等待节点成为主节点,然后才能对其调用任何其他方法,如
AppendToStreamAsync
,而不会在原始问题中遇到异常

如果示例是针对集群的,那么它不应该使用
AsClusterMember()
而不是
AsSingleNode()
?知道为什么启动节点嵌入api时不能浏览流吗?我在端口2113上设置了外部http,但localhost:2113未打开。您可以使用node.StartAndWaitUntilReady().Wait();避免所有的状态检查部分。。。不要被类名所愚弄,例如单节点,要加入集群必须使用AsClusterMember(clusterSize)。