IDispatchMessageInspector CorrelationState, e acessá-lo no meio

votos
1

O meu método AfterRecieveRequest gera um GUID, e passa esta no meio da variável correlationState com o método BeforeSendReply.

Entre essas duas chamadas, muita coisa acontece no meu serviço WCF, e eu gostaria acessar este GUID de dentro dos métodos Webservice. Existe uma maneira para eu acessar esse objeto ao longo do serviço WCF?

O GUID é usado para fins de registro, como eu estou chamando a API de um aplicativo diferente e quiser registrar os resultados, e registrá-los sob o GUID gerado na implementação IDispatchMessageInspector.

por exemplo:

implementação IDispatchMessageInspector:

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

}

Serviço 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;
}

Como eu iria para conseguir isso? Eu estive pensando sobre como usar um atributo ThreadStatic assim o fio mantém o GUID em algum lugar na memória, mas temo o meu entendimento deste assunto é insuficiente para implementá-lo agora.

Publicado 18/12/2018 em 11:10
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Se você só quiser acessar o guid entre BeforeSendReply e AfterReceiveRequest, você poderia usar MessageProperties, os MessageProperties pode ser acessado quando você executar o seu serviço.

Abaixo está o meu teste.

  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)
    {

    }

Então você poderia obter o guid no seu serviço.

 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;
    }
}
Respondeu 27/12/2018 em 06:35
fonte usuário

votos
0

Não sei se este seria o que você quer, mas provavelmente você pode adicionar o GUID para o cabeçalho da mensagem de canal. Alguém já escreveu algumas informações úteis sobre este: https://stackoverflow.com/a/1408177/2016162

Respondeu 18/12/2018 em 16:07
fonte usuário

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