2015-12-08 13 views

cevap

14

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()); 
    } 
} 
+0

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

+0

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

+0

Sayı olduğunu. – SondreB

0

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

+0

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

+0

@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 ... –