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