¿Cómo agregar el encabezado del mensaje a la solicitud cuando se utiliza el cliente predeterminado de Azure Service Fabric?

Me pregunto si es posible inyectar un encabezado de mensaje personalizado a la solicitud saliente para transportar información adicional sin deserializar la carga útil para completar la funcionalidad como autenticación, validación o correlación de solicitud como wcf proporcionada por medio de messagesinspector.

Actualizar

Con SDK v2 ahora puede (relativamente) modificar fácilmente los encabezados tanto de los Servicios confiables como de los Actores. Tenga en cuenta que en los ejemplos a continuación algunos miembros del contenedor se han omitido por brevedad.

Cliente

Usamos ServiceProxyFactory para crear proxies en lugar de ServiceProxy estático. Luego podemos envolver IServiceRemotingClientFactory y IServiceRemotingClient e interceptar las llamadas de servicio. Lo mismo se puede hacer con ActorProxyFactory . Tenga en cuenta que esto anula el comportamiento de atributos como WcfServiceRemotingProviderAttribute , ya que especificamos explícitamente la fábrica del cliente.

 _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 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 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); } } 

Servidor

Heredar de ServiceRemotingDispatcher y ActorServiceRemotingDispatcher para examinar los encabezados.

 class CustomServiceRemotingDispatcher : ServiceRemotingDispatcher { public override async Task RequestResponseAsync(IServiceRemotingRequestContext requestContext, ServiceRemotingMessageHeaders messageHeaders, byte[] requestBody) { // read messageHeaders here // or alternatively put them in an AsyncLocal scope // so they can be accessed down the call chain return base.RequestResponseAsync(requestContext, messageHeaders, requestBody); } } 

Para utilizar esta clase, de nuevo tenemos que anular ServiceRemotingProviderAttribute creando directamente el oyente de comunicación:

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

Hice la misma pregunta en el foro de MSDN hace unas semanas, sin embargo, no recibí respuesta allí.

Miré el código fuente de la biblioteca del cliente y no encontré la manera de agregar encabezados. Me temo que la única forma es agregarlos como parte de la llamada al método. Esto podría hacerse utilizando clases de solicitud como parámetros de método y utilizando herencia para ellas. (por ejemplo, clase RequestBase con encabezados [Authorization, ClientInfo, …]). Luego debe asegurarse de que estos encabezados estén configurados para cada solicitud al envolver todas las invocaciones o configurarlas manualmente.

Las aclaraciones adicionales del equipo de Service Fabric serían muy apreciadas.