EventStore的.Net Core客户端 - 连接已关闭

14

最近我开始尝试使用.net-core的EventStore客户端API(nuget包)。然而,我在将事件写入流中方面遇到了问题。以下是我用于建立连接的代码:

    private readonly string _eventStoreName = "localhost";
    private readonly string _eventStorePort = "1113";
    protected IEventStoreConnection Connection;

    public EventStoreTestFixture()
    {
        var eventStoreIpAddress = Dns.GetHostAddressesAsync(_eventStoreName).Result;
        var ipAddress = GetIpAddressFromHost(eventStoreIpAddress);
        var connectionSettings = ConnectionSettings.Create()
            .SetDefaultUserCredentials(new UserCredentials("admin", "changeit"))
            .EnableVerboseLogging();
        Connection = EventStoreConnection.Create(connectionSettings,new IPEndPoint(ipAddress, int.Parse(_eventStorePort)));
        Connection.ConnectAsync().Wait();
    }

    private static IPAddress GetIpAddressFromHost(IPAddress[] eventStoreIpAddress)
    {
        return
            eventStoreIpAddress.FirstOrDefault(
                ipAddress => ipAddress.AddressFamily.Equals(AddressFamily.InterNetwork));
    }

以下是我尝试写入事件流的代码:

public class EmployeeEventSourcedRepository<T> where T : class, IEvenSourced
{
    private readonly IEventStoreConnection _connection;

    public EmployeeEventSourcedRepository(IEventStoreConnection connection)
    {
        _connection = connection;
    }

    public async Task SaveAsync(T eventSourced)
    {
        var eventsToSave =
            eventSourced.PendingChanges
                .Select(change => new EventData(Guid.NewGuid(),
                    change.GetType().Name,
                    true,
                    Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(change, Formatting.None)),
                    new byte[]{}));

        var streamId = $"{eventSourced.GetType().Name.ToLowerInvariant()}-{eventSourced.Id}";
        await _connection.AppendToStreamAsync(streamId, ExpectedVersion.Any, eventsToSave);
    }
}

IEventSourced接口非常直观,如下所示:

public interface IEvenSourced
{
    Guid Id { get; }
    IEnumerable<Event> PendingChanges { get; }
}

现在,当我调用SaveAsync函数时,我经常遇到异常:EventStore.ClientAPI.Exceptions.ConnectionClosedException:连接'ES-9105371b-bf54-4e18-98e7-d67e4ce11aef'已关闭
附注:我也尝试使用.NET客户端API,相同的代码似乎可以正常工作。
如有任何指导,将不胜感激。干杯!

那个软件包仍处于阿尔法版本。你尝试在完整框架上做同样的事情了吗? - Andrii Litvinov
是的,我有。它在完整框架上运行得非常好。但我们正在为这个项目探索.NET Core。因此,有这个问题 :) - Nayab Siddiqui
有道理,但我认为值得问一下。我也对一个主题感兴趣,但我还不会在项目中使用阿尔法。Atom API可以作为.NET Core项目的替代方案。 - Andrii Litvinov
3
只是提醒一下。如果您现在没有本地运行事件存储,则会收到此错误。 - Razvan Dumitru
这个问题有任何进展吗? - Boas Enkler
@RazvanDumitru 为什么你必须在本地运行它?有没有办法让它在不同的计算机上运行? - patrick
3个回答

3

我遇到了同样的问题,并且使用以下方法使其正常工作:

public EventStore()
{
    _connection = EventStoreConnection.Create(
        new IPEndPoint(
            IPAddress.Parse("127.0.0.1"),
            1113
        )
    );
    _connection.ConnectAsync().Wait();
}

public void Publish(DomainEvent domainEvent)
{
    _connection.AppendToStreamAsync(
        "stream-name",
        ExpectedVersion.Any,
        new EventData(
            Guid.NewGuid(),
            domainEvent.GetType().FullName,
            false, 
            Encoding.UTF8.GetBytes(domainEvent.ToString()),
            new byte[] {}
        )
    ).Wait();
}

1

我将EventStore的版本更改为5.0.2并解决了问题。


0

我曾经遇到过同样的问题,在我的情况下,服务器接受了安全的TLS连接,您可以在以下配置中禁用它

server:

   EVENTSTORE_DISABLE_INTERNAL_TCP_TLS=True
   EVENTSTORE_DISABLE_EXTERNAL_TCP_TLS=True

ConnectionString:

UseSslConnection=False

在这里看一下

或者您可以配置客户端以建立安全连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接