You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨局域网PC连接EventStoreDB 23.6失败,遇连接拒绝异常

同一局域网内EventStoreDB跨PC连接失败问题排查与解决

问题描述

我在同一局域网内两台PC间搭建EventStoreDB连接:一台PC部署了23.6版本的EventStoreDB服务器,另一台PC运行.NET控制台客户端。本地连接服务器正常,但跨PC读取流事件时抛出Grpc.Core.RpcException异常,错误提示目标计算机主动拒绝连接(192.168.0.14:2113)。已确认服务器运行正常、IP和端口正确,且双方防火墙已关闭。

异常详情

Grpc.Core.RpcException
  HResult=0x80131500
  消息 = Status(StatusCode="Unavailable", Detail="启动gRPC调用时出错。HttpRequestException: 无法建立连接,因为目标计算机主动拒绝。(192.168.0.14:2113) SocketException: 无法建立连接,因为目标计算机主动拒绝。", DebugException="System.Net.Http.HttpRequestException: 无法建立连接,因为目标计算机主动拒绝。(192.168.0.14:2113)
 ---> System.Net.Sockets.SocketException (10061): 无法建立连接,因为目标计算机主动拒绝此连接。
   在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken cancellationToken)
   在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
   在 System.Net.Sockets.Socket.<ConnectAsync>g__WaitForConnectWithCancellation|277_0(AwaitableSocketAsyncEventArgs saea, ValueTask connectTask, CancellationToken cancellationToken)
   在 System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
   --- 内部异常堆栈跟踪结束 ---
   在 System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
   在 System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   在 System.Net.Http.HttpConnectionPool.AddHttp2ConnectionAsync(HttpRequestMessage request)
   在 System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
   在 System.Net.Http.HttpConnectionPool.GetHttp2ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   在 System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
   在 System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
   在 System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
   在 Grpc.Net.Client.Internal.GrpcCall`2.RunCall(HttpRequestMessage request, Nullable`1 timeout)")
  来源 = EventStore.Client
  堆栈跟踪:
   在 EventStore.Client.Interceptors.TypedExceptionInterceptor.<AsyncUnaryCall>b__5_0[TRequest,TResponse](Task`1 t)
   在 System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
   在 System.Threading.Tasks.Task.<>c.<.cctor>b__272_0(Object obj)
   在 System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
--- 之前位置的堆栈跟踪结束 ---
   在 System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback callback, Object state)
   在 System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- 之前位置的堆栈跟踪结束 ---
   在 EventStore.Client.GrpcServerCapabilitiesClient.<GetAsync>d__2.MoveNext()
   在 EventStore.Client.EventStoreClientBase.<GetChannelInfoExpensive>d__12.MoveNext()
   在 EventStore.Client.SharingProvider`2.<FillBoxAsync>d__10.MoveNext()
   在 EventStore.Client.TaskExtensions.<WithCancellation>d__0`1.MoveNext()
   在 EventStore.Client.TaskExtensions.<WithCancellation>d__0`1.MoveNext()
   在 EventStore.Client.EventStoreClientBase.<GetChannelInfo>d__13.MoveNext()
   在 EventStore.Client.EventStoreClientBase.<GetChannelInfo>d__13.MoveNext()
   在 EventStore.Client.EventStoreClient.<>c__DisplayClass27_0.<<ReadStreamAsync>b__0>d.MoveNext()
   在 EventStore.Client.EventStoreClient.ReadStreamResult.<>c__DisplayClass19_0.<<-ctor>g__PumpMessages|0>d.MoveNext()
   在 System.Threading.Channels.AsyncOperation`1.GetResult(Int16 token)
   在 System.Threading.Channels.ChannelReader`1.<ReadAllAsync>d__12.MoveNext()
   在 System.Threading.Channels.ChannelReader`1.<ReadAllAsync>d__12.System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult(Int16 token)
   在 EventStore.Client.EventStoreClient.ReadStreamResult.<GetAsyncEnumerator>d__20.MoveNext()
   在 EventStore.Client.EventStoreClient.ReadStreamResult.<GetAsyncEnumerator>d__20.MoveNext()
   在 EventStore.Client.EventStoreClient.ReadStreamResult.<GetAsyncEnumerator>d__20.System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult(Int16 token)
   在 System.Runtime.CompilerServices.ValueTaskAwaiter`1.GetResult()
   在 Program.<Main>d__0.MoveNext() 位置 C:\Users\Yader Barahona\source\repos\ES_Consola\ES_Consola\Program.cs:行号 36
   在 Program.<Main>d__0.MoveNext() 位置 C:\Users\Yader Barahona\source\repos\ES_Consola\ES_Consola\Program.cs:行号 36

客户端代码

var settings = EventStoreClientSettings.Create("esdb://192.168.0.14:2113?tls=false");
settings.DefaultCredentials = new UserCredentials("admin", "changeit");

var client = new EventStoreClient(settings);

var streamName = "shopping_cart_stream"; 

var subscription = client.SubscribeToStreamAsync(
    streamName,
    FromStream.Start,
    async (subscription, @event, cancellationToken) =>
    {
        var eventType = @event.Event.EventType;
        var eventData = Encoding.UTF8.GetString(@event.Event.Data.ToArray());
        var eventMessage = $"EventType: {eventType}, Data: {eventData}";

        Console.WriteLine(eventMessage);
    }
);

var events = client.ReadStreamAsync(
    Direction.Forwards,
    streamName,
    StreamPosition.Start);

await foreach (var @event in events)
{
    var eventData = Encoding.UTF8.GetString(@event.Event.Data.ToArray());
    Console.WriteLine(eventData);
}

解决步骤

1. 修改EventStoreDB监听配置

EventStoreDB默认仅绑定localhost,需调整配置让其监听局域网IP:

  • 找到EventStoreDB的配置文件(通常为eventstore.conf,或通过命令行参数设置)
  • 添加或修改以下配置项:
    advertise-external-as = 192.168.0.14
    listen-on-http = 0.0.0.0:2113
    listen-on-tcp = 0.0.0.0:1113
    
    • advertise-external-as:指定服务器对外暴露的IP地址
    • listen-on-http:设置为0.0.0.0:2113允许所有网卡接收HTTP/gRPC请求
    • listen-on-tcp:设置为0.0.0.0:1113允许所有网卡接收TCP请求(若使用TCP协议)

2. 重启EventStoreDB服务

保存配置后,重启EventStoreDB服务使新配置生效。

3. 验证端口连通性

在客户端PC执行以下命令验证端口是否开放:

# PowerShell命令
Test-NetConnection 192.168.0.14 -Port 2113

或使用telnet:

telnet 192.168.0.14 2113

若返回连通成功,则配置生效。

原因说明

EventStoreDB默认仅监听localhost(127.0.0.1),只有服务器本机的应用能建立连接。跨PC连接时,必须配置服务器监听所有网卡或指定局域网IP,才能让局域网内其他设备访问。

内容的提问来源于stack exchange,提问作者Yader Barahona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:30:08