İleti yükünün seri hale getirilmeden ek bilgi taşıması için özel ileti üstbilgisini, iletiler dizisi tarafından sağlanan wcf gibi bir isteğin kimlik doğrulaması, doğrulaması veya korelasyonu gibi işlevlerin yerine getirilmesi için enjekte edilmesinin mümkün olduğunu merak ediyorum.Varsayılan istemci Azure hizmet paketini kullanırken istek üzerine ileti üstbilgisi nasıl eklenir?
Varsayılan istemci Azure hizmet paketini kullanırken istek üzerine ileti üstbilgisi nasıl eklenir?
cevap
Güncelleme
artık (nispeten) kolayca Güvenilir Hizmetler ve Aktörler hem başlıklarını değiştirebilir. Aşağıdaki örneklerde bazı sarıcı üyeler kısırlık için ihmal edilmiştir.
Müşteri
Bunun yerine statik ServiceProxy
proxy'leri oluşturmak için ServiceProxyFactory
kullanın. Daha sonra IServiceRemotingClientFactory
ve IServiceRemotingClient
'u sardık ve servis çağrılarını engelleyebiliriz. Aynı şey ActorProxyFactory
ile yapılabilir. Bu, istemci fabrikasını kendimiz belirttiğimizden beri, WcfServiceRemotingProviderAttribute
gibi özelliklerin davranışlarını geçersiz kılar. ServiceRemotingDispatcher
ve ActorServiceRemotingDispatcher
den
_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);
}
}
Sunucu
devral başlıklarını incelemek.
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);
}
}
Bu sınıf kullanmak için, yine doğrudan iletişim dinleyicisi oluşturarak
ServiceRemotingProviderAttribute
geçersiz kılmak gerekir:
class MyService : StatelessService
{
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
yield return new ServiceInstanceListener(context => new WcfServiceRemotingListener(context, new CustomServiceRemotingDispatcher());
}
}
Birkaç hafta önce the same question on the MSDN forum sordum, ancak orada bir yanıt almadım.
İstemci kitaplığının kaynak kodunu inceledim ve üstbilgi eklemenin bir yolunu bulamadım. Korkarım tek yol, onları yöntem çağrısının bir parçası olarak eklemektir. Bu, istek sınıflarını yöntem parametreleri olarak ve bunlar için miras kullanarak gerçekleştirilebilir. (örneğin, başlıkları olan RequestBase sınıfı [Yetkilendirme, ClientInfo, ...]). Daha sonra, bu başlıklar her istek için tüm davetleri veya manuel olarak ayarlayarak ayarlandığından emin olmanız gerekir. Service Fabric ekibinden daha fazla açıklama büyük takdir edilecektir. SDK v2 ile
nerede id istemci kaynak kodunu bulmak? Api'yi kontrol ettim, bana bir ServiceRemotingHeaders sınıfı var, bu da bana giden isteklere özel başlık eklemenin yolları olduğunu düşünür. Ayrıca, müşteri iletişimi gerçekleştirmek için wcf'yi kullanıyor. eğer öyleyse, messageinspector'ı geliştiriciye sunmak mümkün olmalıdır. – Xiangdong
@Xiangdong ILSpy ile Microsoft.ServiceFabric.Services.dll dosyasına baktım. ServiceRemotingHeaders, gitmek için yol gibi görünüyor. Ancak onları dışarıdan kurmanın bir yolunu bulamadım. ServiceProxy.InvokeAsync() bir istek başlatan yer olduğunu düşünüyorum ve ServiceRemotingMessageHeaders değişkenini dahili olarak oluşturur ve alt akış ServicePartitionClient'e geçirir. Ama belki bir şey özledim ... –
Ben aynı yönde gidiyorum, kod örneği kesin yardım çok. Ancak yine de Microsoft'un bu tür kullanım durumlarını etkinleştirmek için aynı ileti işleyici mekanizmasını sağlamasını diliyorum. – Xiangdong
ServiceInstanceListener, dağıtıcı için WcfServiceRemotingListener ile aynı şekilde yapıcı parametresi içermiyor. Remoting kullanıldığında nasıl bir gönderici eklenir?ServiceInstanceListener ICommunicationListener olup IServiceRemotingMessageHandler alır ve bu arabirim mesaj başlıklarını döndürür yöntemleri yok – SondreB
Sayı olduğunu. – SondreB