2016-10-03 38 views
1

我正在使用ServicePartitionResolver获取群集中另一个应用程序的http端点。服务结构ServicePartitionResolver ResolveAsync

var resolver = ServicePartitionResolver.GetDefault(); 
var partition = await resolver.ResolveAsync(serviceUri, partitionKey ?? ServicePartitionKey.Singleton, CancellationToken.None); 
var endpoints = JObject.Parse(partition.GetEndpoint().Address)["Endpoints"]; 
return endpoints[endpointName].ToString().TrimEnd('/'); 

可正常工作,但是如果我重新部署我的目标应用和我的本地开发框其端口更改,源应用程序仍返回旧端点(也就是现在的无效)。有没有可以清除的缓存?或者这是一个错误?

回答

4

是的,他们被缓存。如果您知道该分区不再有效,或者如果您收到错误,则可以调用resolver.ResolveAsync(),该过载具有较早的ResolvedServicePartitionpreviousRsp,这会触发刷新。

此api超载用于客户端知道 已解析的服务分区不再有效的情况。

也请参阅article

0

是的。他们被缓存。有两种解决方案可以解决这个问题。

  1. ,你需要做的最简单的代码改变是var resolver = new ServicePartitionResolver();取代var resolver = ServicePartitionResolver.GetDefault();。这迫使服务每次都创建一个新的ServicePartitionResolver对象。而GetDefault()获取缓存的对象。
  2. [推荐]处理这个问题的正确方法是实现一个实现CommunicationClientFactoryBase的自定义CommunicationClientFactory。然后初始化ServicePartitionClient并致电InvokeWithRetryAsync。它在Service Communication中明确记载在通信客户端和工厂部分。