IDispatchMessageInspector CorrelationState et y accéder entre

voix
1

Ma méthode AfterRecieveRequest génère un GUID, et passe à travers ce sur la variable correlationState la méthode BeforeSendReply.

Entre ces deux appels, beaucoup se passe dans mon service WCF, et je voudrais accéder à ce GUID à partir de méthodes de Webservice. Est-il possible pour moi d'accéder à cet objet à travers le service WCF?

Le GUID est utilisé à des fins d'exploitation forestière, comme je fais appel à l'API d'une application différente et que vous souhaitez enregistrer les résultats, et les connecter sous le GUID généré dans la mise en œuvre IDispatchMessageInspector.

par exemple:

la mise en œuvre 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);

}

WCF Service:

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

Comment puis-je continuer d'y arriver? J'ai pensé à l'aide d'un attribut ThreadStatic de sorte que le fil conserve quelque part le GUID dans la mémoire, mais je crains que ma compréhension de ce sujet ne suffit pas à le mettre en œuvre en ce moment.

Créé 18/12/2018 à 11:10
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Je ne sais pas ce serait ce que vous voulez, mais vous pouvez probablement ajouter le GUID à tête de votre message de canal. Quelqu'un a déjà écrit quelques informations utiles à ce sujet : https://stackoverflow.com/a/1408177/2016162

Créé 18/12/2018 à 16:07
source utilisateur

voix
1

Si vous voulez seulement accéder au guid entre BeforeSendReply et AfterReceiveRequest, vous pouvez utiliser MessageProperties, les MessageProperties pourraient être accessibles lorsque vous exécutez votre service.

Ci-dessous mon test.

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

    }

Ensuite, vous pouvez obtenir le guid dans votre service.

 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;
    }
}
Créé 27/12/2018 à 06:35
source utilisateur

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