2016-08-03 3 views
0

Service Fabric on premiseで実行するように構築しているマイクロサービスベースのシステムでIdentityServer3を使用しています。私は、Web APIステートレスサービスの1つからイントロスペクションエンドポイントを呼び出すために使用されるHttpClientインスタンスを置き換えることが可能かどうかを知りたがっています。IdentityServer3のイントロスペクション用のデフォルトHttpClientの置き換え

サービスファブリックを使用すると、クラスター内の他のサービスを直接呼び出すことはできますが、サービスレジストリを照会してサービスの特定のURLを調べる必要があります。クラスタ)。これを行うためのパターンやクラスがありますが、サービスが別のノードに移動し、ノードがオフラインになった場合などに再試行ループをラップする必要があります。

代わりに、ロードバランサ/ APIルックアップ/リトライロジックが含まれているが、可能であればこの余分なホップが発生しないようにするゲートウェイです。

どのようなアイデアや助けも大歓迎です!

答えて

3

あなたが参照しているトークン検証のために推測しており、optionsを見ると、実際にリクエストを行うためにHttpMessageHandlerを設定することができます。

次に、メッセージハンドラのSendAsync部分を実装して、要求が送信されているURLを変更できます。

クイック例:POULの答えに基づいて

public class MessageHandler1 : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     //Update the request url by replacing the base address to the internal endpoint. 
     return base.SendAsync(request, cancellationToken); 

    } 
} 
+0

ありがとう、HttpMessageHandlerで可能だったのかどうか疑問に思っていましたが、わかりませんでした(私に!)。私はそのアプローチをもう一度見て、あなたに戻ってきます – isaacmcn

+0

この例に感謝し、このアプローチを指摘してください!私はそれを次のコードで動作させることができました: – isaacmcn

+0

私はそれをあなたの例と[service fabric docs](https://azure.microsoft.com/en-us/documentation)に基づいたコードを使って動作させることができました/ articles/service-fabric-reliable-services-communication /)。私はコードサンプルを投稿することができますが、それはコメントのためには長すぎます、ここのエチケットは何ですか? :-) – isaacmcn

2

私はそれが次のコードでの作業を取得するために管理してきました:

public class CustomHandler : DelegatingHandler 
{ 
    private static readonly FabricClient FabricClient = new FabricClient(); 
    private static readonly HttpCommunicationClientFactory CommunicationFactory = new HttpCommunicationClientFactory(new ServicePartitionResolver(() => FabricClient)); 

    public CustomHandler() : base(new HttpClientHandler()) {} 

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     var partitionClient = new ServicePartitionClient<HttpCommunicationClient>(CommunicationFactory, new Uri("fabric:/IdentityService/AuthApi")); 

     return await partitionClient.InvokeWithRetryAsync(
      async (client) => 
      { 
       //replace base address with resolved url of internal endpoint 
       request.RequestUri = new Uri(client.Url, request.RequestUri.PathAndQuery); 
       return await base.SendAsync(request, cancellationToken); 
      }, cancellationToken); 
    } 
} 

注HttpCommunicationClientFactory、HttpCommunicationClientはhere定義されたパターンに従うこと。

IdSrvもPublicOriginで構成する必要がありました。そうしないと、JWTオーディエンス値は、サービスがどのノードにあるかによって異なる可能性があります。

関連する問題