跨局域网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:1113advertise-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
相关产品推荐
相关产品推荐

