我在Service Fabric 6上有一个Asp.net Core 2.0无状态服务和一个Asp.net Core 2.0状态服务,有10个分区计数。
我遵循了本教程
https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-add-a-web-frontend
我遵循了所有步骤,只是我在Visual Studio中使用了模板 CreateServiceReplicaListeners使用KestrelCommunicationListener
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
return new ServiceReplicaListener[]
{
new ServiceReplicaListener(serviceContext =>
new KestrelCommunicationListener(serviceContext, (url, listener) =>
{
return new WebHostBuilder()
.UseKestrel()
.ConfigureServices(
services => services
.AddSingleton<StatefulServiceContext>(serviceContext)
.AddSingleton<IReliableStateManager>(this.StateManager))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
.UseUrls(url)
.Build();
}))
};
}
当我使用此代码在Asp.net Core 2.0无状态服务中调用我的服务时:
var service = ServiceProxy.Create<IStorageService>(new Uri("fabric:/MyCluster/Storage"), new ServicePartitionKey(Fnv1aHashCode.Get64bitHashCode(User.Id)));
await service.MyMethod();
调用&#34; MyMethod&#34;
时会出现异常客户正在尝试连接无效地址http://localhost:58352/etc ..
异常中存在的URL存在于Service Fabric Explorer中,并且Port和PartitionKey是正确的。 ServiceManifest中没有设置端点,因为有状态服务基本上只是模板,在上面的教程中添加了IService接口和MyMethod方法。
我在这里失踪了什么? Asp.net Core 2.0的文档不是最新的。
我尝试不使用分区,设置ServicePartitionKey(0)
但结果相同。
我不知道如何继续。
答案 0 :(得分:5)
您正在混合两个完全不同的通信堆栈:
你不能把两者混在一起。您需要使用HTTP客户端与服务的HTTP端点进行通信。 Service Fabric中有一个HTTP reverse proxy,它将为您执行服务发现和请求转发,使其更容易。还有一个DNS service,允许您使用简单的DNS名称来解决其他服务。
在您引用的教程中,后端服务使用Service Remoting侦听器,该侦听器公开ServiceProxy的RPC端点以连接到:
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
return new List<ServiceReplicaListener>()
{
new ServiceReplicaListener(
(context) =>
this.CreateServiceRemotingListener(context))
};
}