IDispatchMessageInspector CorrelationState и доступ к нему между

Мой метод 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 ответа

Решение

Если вы хотите получить доступ только к 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;
    }
}

Не уверен, что это то, что вы хотите, но вы, вероятно, можете добавить GUID в заголовок сообщения вашего канала. Кто-то уже написал некоторую полезную информацию об этом: /questions/17834834/kak-dobavit-sobstvennyij-zagolovok-http-dlya-kazhdogo-vyizova-wcf/17834859#17834859

Другие вопросы по тегам