连接Web API至Service Fabric无状态服务时V2Listener未找到错误求助
解决Service Fabric Remoting V2中NamedEndpoint 'V2Listener'未找到的错误
这个错误的核心原因很明确:你的后端服务注册的Remoting监听器名称,和客户端ServiceProxy默认寻找的端点名称不匹配。
因为你使用的是Service Fabric Remoting V2,客户端调用ServiceProxy.Create<ICompanyManagement>时,默认会去寻找名为V2Listener的服务端点,但你的后端服务里注册的监听器名称是ServiceEndpoint,这就导致客户端找不到对应的端点,抛出了那个错误。
这里有两种简单的解决方案,你可以任选其一:
方案一:修改服务端的监听器名称为V2Listener
直接把后端服务CreateServiceInstanceListeners方法里的监听器名称改成V2Listener,这样客户端的默认配置就能直接匹配上:
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() { return new[] { new ServiceInstanceListener(serviceContext => new FabricTransportServiceRemotingListener(serviceContext, this), "V2Listener") // 将原名称"ServiceEndpoint"替换为"V2Listener" }; }
方案二:客户端创建代理时指定端点名称
如果你不想改动服务端的配置,可以在Web API的CompanyController里创建代理时,显式指定服务端使用的监听器名称:
public CompanyController(StatelessServiceContext context) { string serviceUri = $"{context.CodePackageActivationContext.ApplicationName}" + "/MyProject.Management.Company"; _proxy = ServiceProxy.Create<ICompanyManagement>( new Uri(serviceUri), listenerName: "ServiceEndpoint"); // 明确指定服务端的监听器名称 }
额外注意事项
- 请确保你的
Microsoft.ServiceFabric.Services.RemotingNuGet包版本和Service Fabric Runtime v6.2.274兼容,.NET Core 2.x环境下要选择对应版本的包,避免版本不兼容带来的隐性问题。 - 检查服务的
ServiceManifest.xml文件,如果里面显式定义了Endpoint节点,要保证节点的Name属性和代码里的监听器名称完全一致,比如:
这种情况下代码里的监听器名称就必须是<Endpoints> <Endpoint Name="ServiceEndpoint" /> </Endpoints>ServiceEndpoint,或者你也可以调整Manifest里的名称来匹配代码配置。
内容的提问来源于stack exchange,提问作者Walid Hanafy
相关产品推荐
相关产品推荐

