IDispatchMessageInspector CorrelationState, a dostępu do niego w między

głosy
1

My sposób AfterRecieveRequest generuje GUID i przekazuje go dalej przez zmienną correlationState do sposobu BeforeSendReply.

Pomiędzy tymi dwoma połączeniami, dużo się dzieje w moim usług WCF, i chciałbym, aby uzyskać dostęp do tej GUID od wewnątrz Zestawienie metod. Czy istnieje sposób dla mnie, aby uzyskać dostęp do tego obiektu przez cały usługi WCF?

Identyfikator GUID jest używany do celów rejestrowania, jak wzywam API innej aplikacji i chcesz się zalogować wyniki i zaloguj je pod GUID generowanego w realizacji IDispatchMessageInspector.

na przykład:

Realizacja 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 usługi:

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

Jak pójdę do osiągnięcia tego celu? Myślałem o użyciu atrybutu ThreadStatic więc nić utrzymuje GUID gdzieś w pamięci, ale obawiam się, moje rozumienie tego tematu jest niewystarczająca, aby wdrożyć go teraz.

Utwórz 18/12/2018 o 11:10
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
1

Jeśli chcesz tylko dostęp GUID między BeforeSendReply i AfterReceiveRequest, można użyć MessageProperties, że MessageProperties mogłyby być dostępne po wykonaniu usługi.

Poniżej jest moje testy.

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

    }

Następnie można uzyskać GUID w usłudze.

 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;
    }
}
Odpowiedział 27/12/2018 o 06:35
źródło użytkownik

głosy
0

Nie wiesz, to byłoby to, co chcesz, ale prawdopodobnie można dodać GUID do nagłówka wiadomości kanału. Ktoś już napisał trochę przydatnych informacji na temat tego produktu: https://stackoverflow.com/a/1408177/2016162

Odpowiedział 18/12/2018 o 16:07
źródło użytkownik

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