Azure service fabric 调用QueryClient.GetServiceListAsync时如何使用serviceNameFilter

Azure service fabric 调用QueryClient.GetServiceListAsync时如何使用serviceNameFilter,azure-service-fabric,Azure Service Fabric,我正在将Azure服务结构与无状态服务一起使用。我有一个应用程序下部署的服务列表,这些服务名称使用命名约定。我想获得与筛选器表达式匹配的服务列表 这里是指向我的service fabric explorer的屏幕截图的链接。我没有声誉点来发布图片 在本例中,我的应用程序的名称是SFApp1,我的服务的名称是HelloWorldStateless。我想查询ServiceFabric集群以查找名为“HelloWorldSt*”的所有服务(当然是在SFApp1应用程序下) 我知道我可以通过查询找到应

我正在将Azure服务结构与无状态服务一起使用。我有一个应用程序下部署的服务列表,这些服务名称使用命名约定。我想获得与筛选器表达式匹配的服务列表

这里是指向我的service fabric explorer的屏幕截图的链接。我没有声誉点来发布图片

在本例中,我的应用程序的名称是SFApp1,我的服务的名称是HelloWorldStateless。我想查询ServiceFabric集群以查找名为“HelloWorldSt*”的所有服务(当然是在SFApp1应用程序下)

我知道我可以通过查询找到应用程序名为“fabric:/SFApp1”的所有服务,它将返回该应用程序下的所有服务。GetServiceListAsync的这个重载只需要一个应用程序URI

FabricClient client = new FabricClient();
ServiceList serviceList = client.QueryManager.GetServiceListAsync(new Uri("fabric:/SFApp1")).Result;
我也知道我可以通过查询找到特定的服务。此重载获取应用程序URI和服务URI,并将返回单个项目列表

FabricClient client = new FabricClient();
ServiceList serviceList = client.QueryManager.GetServiceListAsync(new Uri("fabric:/SFApp1"), new Uri("fabric:/SFApp1/HelloWorldStateless")).Result;
我想知道的是,是否有任何方法可以进行通配符搜索

FabricClient client = new FabricClient();
ServiceList serviceList = client.QueryManager.GetServiceListAsync(new Uri("fabric:/SFApp1"), new Uri("fabric:/SFApp1/HelloWorldSt*")).Result;
指定服务名称的参数的名称是serviceNameFilter,该方法返回一个列表。我想知道,如果结果总是一个单一项目列表,为什么他们会为这个重载返回一个列表。另外,参数名“serviceNameFilter”表明(至少对我来说)可以提供某种表达式来缩小列表的范围

这是我已经试过的。我试过上面的代码,我删掉了几个字符并加了一个星号。我试着不带星号,看看它是否是子字符串匹配。我尝试过SQL风格,带有百分比符号。我试过一个问号。所有这些尝试都返回了一个空列表

我当前的解决方法只是请求该应用程序下的所有服务,我将在客户端代码端使用linq表达式对它们进行过滤。这是可行的,但如果我的服务列表太大,我会担心性能

如果我能亲自检查源代码来回答这个问题,那就太好了

有没有办法做到我想做的事情,或者我只是误解了“serviceNameFilter”的意思,它只是意味着你必须把你想要的整个服务URI都放进去


谢谢你能提供的任何帮助

不幸的是,API参数的名称非常糟糕。它根本不是一个过滤器,它只是服务的名称(因为没有其他查询只返回一个服务,所以这就是如何从应用程序中的所有服务“过滤”到特定的一个服务)

最接近你要找的东西是子名字。这不是通配符搜索,但您可以获取给定名称下存在的所有名称(例如,应用程序中存在的所有服务名称,或具有特定前缀的所有名称)。根据您创建服务名称的结构,这可能适用于您

// System.Fabric.FabricClient.PropertyManagementClient
public Task<NameEnumerationResult> EnumerateSubNamesAsync(Uri name, NameEnumerationResult previousResult, bool recursive)
//System.Fabric.FabricClient.PropertyManagementClient
公共任务EnumerationSubNamesSync(Uri名称、名称EnumerationResult previousResult、布尔递归)
例如:假定集群中存在以下名称:

  • 结构:/SomeApplication/Zone1/Service1
  • 结构:/SomeApplication/Zone1/Service2
  • 结构:/SomeApplication/Zone2/Service1
  • 请注意,在这种情况下,将使用名称“fabric:/SomeApplication”创建应用程序,然后使用上面包含“Zone”段的详细名称创建服务


    如果您现在枚举子名称(“fabric:/SomeApplication/Zone1”,null,true),您将得到一个结果,该结果给出了匹配的全名(上面的1和2)

    不幸的是,API参数的名称非常糟糕。它根本不是一个过滤器,它只是服务的名称(因为没有其他查询只返回一个服务,所以这就是如何从应用程序中的所有服务“过滤”到特定的一个服务)

    最接近你要找的东西是子名字。这不是通配符搜索,但您可以获取给定名称下存在的所有名称(例如,应用程序中存在的所有服务名称,或具有特定前缀的所有名称)。根据您创建服务名称的结构,这可能适用于您

    // System.Fabric.FabricClient.PropertyManagementClient
    public Task<NameEnumerationResult> EnumerateSubNamesAsync(Uri name, NameEnumerationResult previousResult, bool recursive)
    
    //System.Fabric.FabricClient.PropertyManagementClient
    公共任务EnumerationSubNamesSync(Uri名称、名称EnumerationResult previousResult、布尔递归)
    
    例如:假定集群中存在以下名称:

  • 结构:/SomeApplication/Zone1/Service1
  • 结构:/SomeApplication/Zone1/Service2
  • 结构:/SomeApplication/Zone2/Service1
  • 请注意,在这种情况下,将使用名称“fabric:/SomeApplication”创建应用程序,然后使用上面包含“Zone”段的详细名称创建服务

    如果您现在枚举子名称(“fabric:/SomeApplication/Zone1”,null,true),您将得到一个结果,该结果给出了匹配的全名(上面的1和2)