2017-02-07 13 views
0

私は、ステートレスサービスでAzureサービスファブリックを使用しています。私はアプリケーションの下にデプロイされたサービスのリストを持っており、それらのサービス名で使われる命名規則があります。フィルタ式と一致するサービスの一覧を取得したいと思います。QueryClient.GetServiceListAsyncを呼び出すときにserviceNameFilterを使用する方法

ここに、私のサービスファブリックエクスプローラのスクリーンショットへのリンクがあります。私はイメージを投稿する評判のポイントがありません。この例では

Service Fabric Explorer screenshot

、自分のアプリケーションの名前はSFApp1あり、そして私のサービスの名前はHelloWorldStatelessです。私はサービスファブリッククラスターに問い合わせて、 "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全体を入れなければならないということですか?

ご協力いただきありがとうございます!

答えて

1

残念ながら、そのAPIパラメータには厳しい名前が付けられています。フィルタは実際にはフィルタではなく、単にサービスの名前です(1つのサービスを返すだけのクエリはないので、アプリケーション内のすべてのサービスから特に1つだけフィルタリングする方法です)。

あなたが探しているものに最も近いものはEnumerateSubnamesです。ワイルドカード検索ではありませんが、指定された名前の下に存在するすべての名前(たとえば、アプリケーション内に存在するすべてのサービス名、または特定の接頭辞を持つすべての名前)を取得できます。サービス名をどのように作成するかによって、これはあなたのために働くことができます。例えば

// System.Fabric.FabricClient.PropertyManagementClient 
public Task<NameEnumerationResult> EnumerateSubNamesAsync(Uri name, NameEnumerationResult previousResult, bool recursive) 

  1. ファブリック:/ SomeApplication /ゾーン1/Service1の
  2. ファブリック:/ SomeApplication /ゾーン1 /サービス2
  3. ファブリック:以下の名前を推定は、クラスタ内に存在します/ SomeApplication/Zone2/Service1

この場合、アプリケーションはna私は "ファブリック:/ SomeApplication"と "ゾーン"セグメントを組み込んで上記の詳細な名前を持つサービス。

EnumerateSubnames( "fabric:/ SomeApplication/Zone1"、null、true)は、一致した完全な名前(上記の1 & 2)を返します。

関連する問題