IDispatchMessageInspector CorrelationState, y para acceder a él en el medio

votos
1

Mi método AfterRecieveRequest genera un GUID, y pasa este a través de la variable correlationState con el método BeforeSendReply.

Entre esas dos llamadas, una gran cantidad sucede en mi servicio WCF, y me gustaría acceder a este GUID desde el interior de los métodos Webservice. ¿Hay alguna manera de acceder a este objeto a lo largo del servicio WCF?

El GUID se utiliza para cortar troncos, como yo estoy llamando a la API de una aplicación distinta y desea registrar los resultados y registrarlos bajo el GUID generada en la ejecución IDispatchMessageInspector.

por ejemplo:

IDispatchMessageInspector aplicación:

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
    var correlationState = GUID.NewGuid();
    StaticLogger.AddLog(originalMessage, correlationState.ToString(), WCF-Incoming);
    return correlationState;
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
    StaticLogger.AddLog(originalMessage, correlationState.ToString(), WCF-Outgoing);

}

Servicio WCF:

public ResponseObject WCFMethod(string param1, string param2)
{
    ResponseObject response = new ResponseObject();

    Client client = new Client();
    ClientObject result = client.OutsideOperation(param1,param2);
    // here, i would like to log the result object and use the GUID from the correlationstate
    StaticLogger.AddLog(result, correlationState.ToString(), WCF-Internal )

    response.resultAttribute = result;

    return response;
}

¿Cómo iba a pasar a lograr esto? He estado pensando acerca del uso de un atributo ThreadStatic modo que el hilo mantiene el GUID en algún lugar de la memoria, pero me temo que mi comprensión de este tema es insuficiente para ponerlo en práctica en este momento.

Publicado el 18/12/2018 a las 11:10
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

Si sólo desea tener acceso al GUID entre BeforeSendReply y AfterReceiveRequest, se podría utilizar MessageProperties, los MessageProperties se podía acceder al ejecutar su servicio.

A continuación se muestra mi prueba.

  public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        var correlationState = Guid.NewGuid();
        request.Properties["myGuid"] = correlationState; // store guid in Properties
        return correlationState;

    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {

    }

Posteriormente, se podría obtener el GUID en su servicio.

 public class ServiceTest : Test
{

    public double add(double a, double b)
    {
         // get the property through IncomingMessageProperties property
        Guid gu = (Guid)OperationContext.Current.IncomingMessageProperties["myGuid"];
        Console.WriteLine(gu);

        return a + b;
    }
}
Respondida el 27/12/2018 a las 06:35
fuente por usuario

votos
0

No estoy seguro de que esto sería lo que quiere, pero es probable que se puede añadir el GUID para el encabezado del mensaje de canal. Alguien ya escribió alguna información útil sobre este: https://stackoverflow.com/a/1408177/2016162

Respondida el 18/12/2018 a las 16:07
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more