IDispatchMessageInspector CorrelationState и доступ к нему между - PullRequest
0 голосов
/ 18 декабря 2018

Мой метод AfterRecieveRequest генерирует GUID и передает его через переменную correlationState в метод BeforeSendReply.

Между этими двумя вызовами многое происходит в моей службе WCF, и я хотел бы получить доступ к этому GUID из методов Webservice.Есть ли способ для меня, чтобы получить доступ к этому объекту через службу WCF?

GUID используется для целей ведения журнала, так как я вызываю API другого приложения и хочу записывать результаты и регистрировать их под GUID, созданным в реализации IDispatchMessageInspector.

например:

Реализация 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:

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

Как мне поступить, чтобы выполнить это?Я думал об использовании атрибута ThreadStatic, чтобы поток держал GUID где-то в памяти, но боюсь, что моего понимания этого предмета недостаточно для его реализации прямо сейчас.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Если вы хотите получить доступ только к guid между BeforeSendReply и AfterReceiveRequest, вы можете использовать MessageProperties, к MessageProperties можно получить доступ при выполнении вашей службы.

Ниже приведен мой тест.

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

    }

Тогда вы можете получить руководство в вашем сервисе.

 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;
    }
}
0 голосов
/ 18 декабря 2018

Не уверен, что это то, что вам нужно, но вы, вероятно, можете добавить GUID в заголовок сообщения своего канала.Кто-то уже написал некоторую полезную информацию по этому поводу: https://stackoverflow.com/a/1408177/2016162

...