私は可能性がありますメッセージのインスペクタによって提供されるwcfのような要求の認証、検証または相関のような機能をfullfillにペイロードを非直列化せずに追加情報を運ぶために発信メッセージにカスタムメッセージヘッダーを挿入することができますか?Azureサービスファブリックのデフォルトクライアントを使用している場合、リクエストにメッセージヘッダーを追加するにはどうすればよいですか?
答えて
更新
あなたは今、(比較的)簡単に信頼性の高いサービスと俳優の両方のヘッダを変更することができます。以下の例では、簡潔にするためにいくつかのラッパーメンバーが省略されています。私たちは、プロキシの代わりに、静的ServiceProxy
を作成するためにServiceProxyFactory
を使用
クライアント
。その後、IServiceRemotingClientFactory
とIServiceRemotingClient
をラップし、サービスコールを傍受することができます。 ActorProxyFactory
でも同じことができます。クライアントのファクトリを明示的に指定するので、これはWcfServiceRemotingProviderAttribute
などの属性の動作をオーバーライドすることに注意してください。
_proxyFactory = new ServiceProxyFactory(c => new ServiceRemotingClientFactoryWrapper(
// we can use any factory here
new WcfServiceRemotingClientFactory(callbackClient: c)));
private class ServiceRemotingClientFactoryWrapper : IServiceRemotingClientFactory
{
private readonly IServiceRemotingClientFactory _inner;
public ServiceRemotingClientFactoryWrapper(IServiceRemotingClientFactory inner)
{
_inner = inner;
}
public async Task<IServiceRemotingClient> GetClientAsync(Uri serviceUri, ServicePartitionKey partitionKey, TargetReplicaSelector targetReplicaSelector,
string listenerName, OperationRetrySettings retrySettings, CancellationToken cancellationToken)
{
var client = await _inner.GetClientAsync(serviceUri, partitionKey, targetReplicaSelector, listenerName, retrySettings, cancellationToken).ConfigureAwait(false);
return new ServiceRemotingClientWrapper(client);
}
}
private class ServiceRemotingClientWrapper : IServiceRemotingClient
{
private readonly IServiceRemotingClient _inner;
public ServiceRemotingClientWrapper(IServiceRemotingClient inner)
{
_inner = inner;
}
public Task<byte[]> RequestResponseAsync(ServiceRemotingMessageHeaders messageHeaders, byte[] requestBody)
{
// use messageHeaders.AddHeader() here
return _inner.RequestResponseAsync(messageHeaders, requestBody);
}
public void SendOneWay(ServiceRemotingMessageHeaders messageHeaders, byte[] requestBody)
{
// use messageHeaders.AddHeader() here
_inner.SendOneWay(messageHeaders, requestBody);
}
}
サーバー
継承ServiceRemotingDispatcher
とActorServiceRemotingDispatcher
からヘッダを調べました。
class CustomServiceRemotingDispatcher : ServiceRemotingDispatcher
{
public override async Task<byte[]> RequestResponseAsync(IServiceRemotingRequestContext requestContext, ServiceRemotingMessageHeaders messageHeaders, byte[] requestBody)
{
// read messageHeaders here
// or alternatively put them in an AsyncLocal<T> scope
// so they can be accessed down the call chain
return base.RequestResponseAsync(requestContext, messageHeaders, requestBody);
}
}
このクラスを使用するには、再び我々は直接通信リスナー作成することにより、ServiceRemotingProviderAttribute
をオーバーライドする必要があります。idは、クライアントのソースコードをお探し
class MyService : StatelessService
{
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
yield return new ServiceInstanceListener(context => new WcfServiceRemotingListener(context, new CustomServiceRemotingDispatcher());
}
}
私は数週間前にthe same question on the MSDN forumに尋ねましたが、私はそこに返答しませんでした。
クライアントライブラリのソースコードを調べましたが、ヘッダーを追加する方法が見つかりませんでした。私は唯一の方法はメソッド呼び出しの一部としてそれらを追加することだと思います。これは、メソッド・パラメーターとしてrequest-classを使用し、それらに継承を使用することによって実行できます。 (ヘッダ[Authorization、ClientInfo、...]を含むRequestBaseクラス)。これらのヘッダーは、すべての呼び出しをラップするか、または手動で設定することによって、すべての要求に対して設定されていることを確認する必要があります。
サービスファブリックチームのさらなる明確化が大いに評価されます。 SDK v2では
を?私はAPIをチェックアウトしました。そこには、送信要求にカスタムヘッダーを追加する方法があると思うServiceRemotingHeadersクラスがあります。さらに、クライアントはwcfを使用して通信を行っているようです。そうであれば、messageinspectorを開発者に公開することが実現可能であるはずです。 – Xiangdong
@ Xiangdong私はILSpyでMicrosoft.ServiceFabric.Services.dllを見ました。 ServiceRemotingHeadersは行く方法のようです、はい。しかし、私はそれらを外部から設定する方法を見つけていません。 ServiceProxy.InvokeAsync()は要求を開始する場所で、内部的にServiceRemotingMessageHeaders変数を作成し、それを下流のServicePartitionClientに渡します。しかし、多分私は何かを逃した... –
- 1. file_get_contents()を使用してAuthorizationヘッダーをHTTPリクエストに追加するにはどうすればよいですか?
- 2. リクエストにヘッダーフィールドを追加するにはどうすればよいですか?
- 3. 追加データをリクエストするにはどうすればよいですか?
- 4. webpackを使用してサードパーティの統合コードを追加するにはどうすればよいですか?
- 5. SOAP UIを使用する場合、リクエストに複数の繰り返しを追加するにはどうすればよいですか?
- 6. 疑似トランザクションマネージャを使用してメッセージヘッダーを渡すにはどうすればよいですか?
- 7. シングルページを使用している場合、すべてのルートにheader.htmlとfooter.htmlの両方を追加するにはどうすればよいですか?
- 8. codeigniterを使用してアップロードする場合、画像の別の場所にウォーターマークを追加するにはどうすればよいですか?
- 9. 継続的に実行するアプリケーションをAzureサービスファブリックにデプロイするにはどうすればよいですか?
- 10. 「Actor Reminder」メカニズムを使用してサービスファブリック内のタスクをスケジュールするにはどうすればよいですか?
- 11. VSTSを使用する場合、Azureクラウドサービスパッケージに追加のファイルを含めるにはどうすればよいですか?
- 12. Windows認証を使用してサービスファブリックにパブリッシュするにはどうすればよいですか?
- 13. Xamarin.iosでAVAssetExportSessionを使用している場合、アニメーションをCALayerに正しく追加するにはどうすればよいですか?
- 14. 別のディレクトリにある場合、.hファイルを追加するにはどうすればよいですか?
- 15. asp.netを使用している場合、どのように私のページにビデオを追加できますか?
- 16. カスタムビットマップを使用してMFCのツールバーにチェックボックスを追加するにはどうすればよいですか?
- 17. Javassistを使用して、空のループにコードを追加するにはどうすればよいですか?
- 18. wp_nav_menuを使用してulの前にタイトルを追加するにはどうすればよいですか?
- 19. fixup_bundleを使用してOSXのフレームワークにライブラリを追加するにはどうすればよいですか?
- 20. C#でEnyim.Cachingを使用してmemcachedにデータを追加するにはどうすればよいですか?
- 21. ggplot2の場合、散布図にカーブを追加するにはどうすればよいですか?
- 22. サービスファブリックにカスタムシリアライザを登録するにはどうすればよいですか?
- 23. JavaScriptを使用して既存のFileListオブジェクトに追加するにはどうすればよいですか?
- 24. html5キャンバスを使用して画像にテキストを追加するにはどうすればよいですか?
- 25. View Pagerを使用してコーディネーターレイアウトにボトムビューを追加するにはどうすればよいですか?
- 26. customadapterを使用してリストビューにスピナーを追加するにはどうすればよいですか?
- 27. MKPointAnnotationを使用してMKMapViewに注釈を追加するにはどうすればよいですか?
- 28. ddplyを使用してデータフレームに列を追加するにはどうすればよいですか?
- 29. ストーリーボードを使用してUIScrollビューにUILabelを追加するにはどうすればよいですか?
- 30. closedxmlを使用してシンボルをセルに追加するにはどうすればよいですか?
私は同じ方向に行く、あなたのコードの例明確な助けたくさん。しかし、Microsoftは、このようなユースケースを可能にするために、同じメッセージハンドラメカニズムをMicrosoftに提供したいと考えています。 – Xiangdong
ServiceInstanceListenerには、WcfServiceRemotingListenerと同じ方法で、dispatcherのコンストラクタパラメータがありません。 Remotingを使用する場合、ディスパッチャをどのように追加しますか? – SondreB
ServiceInstanceListenerはIServiceRemotingMessageHandlerではなくICommunicationListenerを受け取り、そのインターフェイスにはメッセージヘッダーを返すメソッドがありません。 – SondreB