IDispatchMessageInspector CorrelationState, und der Zugriff auf sie zwischendurch

stimmen
1

My AfterRecieveRequest Methode erzeugt eine GUID, und leitet diese weiter durch die correlationState Variable auf die BeforeSendReply Methode.

Zwischen diesen beiden Anrufe, geschieht eine Menge in meinem WCF-Dienst, und ich möchte diese GUID für den Zugriff von innerhalb der Webservice-Methoden. Gibt es eine Möglichkeit für mich, um dieses Objekt während des WCF-Dienst zugreifen?

Die GUID wird zur Protokollierung verwendet, da ich auf der API von einer anderen Anwendung anzurufenden und wollen die Ergebnisse protokollieren, und melden sie unter dem GUID in der Umsetzung IDispatchMessageInspector erzeugt.

zum Beispiel:

IDispatchMessageInspector Umsetzung:

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

Wie würde ich dies zu erreichen, weitergehen? Ich habe darüber nachgedacht, ein Threadstatic-Attribut so der Thread die GUID irgendwo im Speicher hält, aber ich fürchte, mein Verständnis dieses Themas nicht ausreicht, um es jetzt zu implementieren.

Veröffentlicht am 18/12/2018 um 11:10
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Wenn Sie nur die GUID zwischen BeforeSendReply und AfterReceiveRequest zugreifen möchten, können Sie MessageProperties nutzen könnten, könnten die MessageProperties zugegriffen werden, wenn Sie Ihren Dienst ausführen.

Unten ist mein 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)
    {

    }

Dann könnten Sie die GUID in Ihrem 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;
    }
}
Beantwortet am 27/12/2018 um 06:35
quelle vom benutzer

stimmen
0

Nicht sicher , das wäre , was Sie wollen, aber Sie können wahrscheinlich die GUID auf Ihren Kanal - Message - Header hinzufügen. Jemand schon schrieb einige nützliche Informationen zu diesem Thema auf: https://stackoverflow.com/a/1408177/2016162

Beantwortet am 18/12/2018 um 16:07
quelle vom benutzer

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