gpt4 book ai didi

azure - 当使用多个通信监听器时,必须为每个监听器指定唯一名称

转载 作者:行者123 更新时间:2023-12-02 06:31:21 26 4
gpt4 key购买 nike

我创建了一个 .NET Core 无状态 Service Fabric 应用程序 (v 3.0.467)。我需要为此服务使用 KestrelCommunicationListener 和 ServiceProxy 远程调用。

当我将应用程序部署到本地集群时,它抛出异常:

Unique Name must be specified for each listener when multiple communication listeners are used Service Fabric Explorer exception

我在 servicemanifest.xml 文件中进行了如下配置

<Resources>
<Endpoints>
<!-- This endpoint is used by the communication listener to obtain the port on which to
listen. Please note that if your service is partitioned, this port is shared with
replicas of different partitions that are placed in your code. -->
<Endpoint Name="ServiceEndpointV2" />
<Endpoint Protocol="http" Name="httpServiceEndpoint" Type="Input" Port="9098" />
</Endpoints>
</Resources>

和代码示例:

  protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[]
{
new ServiceInstanceListener((context) =>
{

// return new FabricTransportServiceRemotingListener(context, this);

return new FabricTransportServiceRemotingListener(context, this,new Microsoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime.FabricTransportRemotingListenerSettings(){EndpointResourceName = "ServiceEndpointV2" });

}),
new ServiceInstanceListener(serviceContext =>
new KestrelCommunicationListener(serviceContext, "httpServiceEndpoint", (url, listener) =>
{
ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");

return new WebHostBuilder()
.UseKestrel()
.ConfigureServices(
services => services
.AddSingleton<StatelessServiceContext>(serviceContext))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseUrls(url)
.Build();
}))
};
}

这个配置有什么错误吗?

更新:

下面的代码是客户端调用的服务示例方法:

 public Task<string> OnRouteMessageaAsync(string tenant)
{
return Task.FromResult(tenant);
}

客户端代码:

 private async Task<string> RemoteServiceCall()
{
try
{
var client = ServiceProxy.Create<ICommunication>(new Uri("fabric:/AuthenticationServiceApp/AuthenticationServiceApi"), listenerName: "RemotingListener");
var response = client.OnRouteMessageaAsync("tenant");
return response.Result;
}
catch (Exception ex)
{

}
return null;
}

示例代码位于以下 GitHub 链接中: serviceappcode

最佳答案

您定义了多个ServiceInstanceListener。为了让 Service Fabric 区分它们,您需要使用 ServiceInstanceListener 构造函数的可选 name 参数来命名它们。请参阅the docs :

Name

Name of the communication listener. This parameter is optional if the Stateless Service has only one communication listener. If it is not given, the Name is set to DefaultName.

    protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new[]
{
new ServiceInstanceListener((context) =>
{

// return new FabricTransportServiceRemotingListener(context, this);

return new FabricTransportServiceRemotingListener(context, this,new Microsoft.ServiceFabric.Services.Remoting.FabricTransport.Runtime.FabricTransportRemotingListenerSettings(){EndpointResourceName = "ServiceEndpointV2" });

}, name: "RemotingListener"),
new ServiceInstanceListener(serviceContext =>
new KestrelCommunicationListener(serviceContext, "httpServiceEndpoint", (url, listener) =>
{
ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");

return new WebHostBuilder()
.UseKestrel()
.ConfigureServices(
services => services
.AddSingleton<StatelessServiceContext>(serviceContext))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseUrls(url)
.Build();
}), name: "KestrelCommunicationListener")
};
}

现在,当您使用远程处理调用服务时,也必须使用此名称:

var client = ServiceProxy.Create<ICommunication>(
new Uri("fabric:/AuthenticationServiceApp/AuthenticationServiceApi"),
listenerName: "RemotingListener");
var result = client.OnRouteMessageaAsync("topic");

关于azure - 当使用多个通信监听器时,必须为每个监听器指定唯一名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50197057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com