簡體   English   中英

使用Azure服務結構的默認客戶端時如何向請求添加郵件頭?

[英]How to add message header to the request when using default client of Azure service fabric?

我想知道可以將自定義消息頭注入傳出請求以攜帶附加信息而無需反序列化有效負載以完成填充功能,如驗證,驗證或請求的相關性,如通過messagesinspector提供的wcf?

更新

使用SDK v2,您現在可以(相對)輕松地修改Reliable Services和Actors的標頭。 請注意,在下面的示例中,為簡潔起見,省略了一些包裝器成員。

客戶

我們使用ServiceProxyFactory來創建代理而不是靜態ServiceProxy 然后我們可以包裝IServiceRemotingClientFactoryIServiceRemotingClient並攔截服務調用。 使用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);
        }
    }

服務器

ServiceRemotingDispatcherActorServiceRemotingDispatcher繼承以檢查標頭。

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

class MyService : StatelessService
{
     protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
     {
          yield return new ServiceInstanceListener(context => new WcfServiceRemotingListener(context, new CustomServiceRemotingDispatcher());
     }
}

幾個星期前我在MSDN論壇上了同樣的問題 ,但我沒有在那里得到回復。

我查看了客戶端庫的源代碼,但沒有找到添加標頭的方法。 我擔心唯一的方法是將它們添加為方法調用的一部分。 這可以通過使用請求類作為方法參數並使用繼承來完成。 (例如帶有標題的RequestBase類[Authorization,ClientInfo,...])。 然后,您必須確保通過包裝所有調用或手動設置為每個請求設置這些標頭。

非常感謝Service Fabric團隊的進一步澄清。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM