Получить имя операции в инспекторе сообщений? - PullRequest
5 голосов
/ 02 апреля 2012

Я использую IClientMessageInspector для входа / выхода сообщений, но проблема в том, что я не могу найти, как получить имя операции от AfterReceivedReply и BeforeSendRequest.

Я проверилследующее:

if ((action = reply.Headers.Action.Split('/').LastOrDefault()) != null)
{
   callInformation.Action = action;
   callInformation.Address = reply.Headers.Action.Replace(action, "");
}

Это прекрасно работает в BeforeSendRequest, но в AfterReveivedReply он возвращает что-то другое, часто с "Response" в конце?

Как мне получить имя операции только в этих методах?

Скажите, что моя операция называется MyOperation, а атрибут OperationContract указывает action = "MyOpeation" (неправильное написание),Это приводит к тому, что MyOpeation будет извлечено в BeforeSendRequest, а AfterReceiveReply вернет MyOperationResponse.

Таким образом, BeforeSendRequest извлечет указанное действие в атрибуте и AfterReceiveReply извлечет реальное имя операции, но с добавлением "Response" в конце?

Важно иметь возможность сопоставлять входящие / исходящие сообщения и единственный способ сделать этокак я вижу, это соответствует именам операций, но если это невозможно, я не вижу хорошего решения для этого?

Я видел решение при использовании OperationContext.Current.IncomingMessageHeaders.Action, но OperationContect.Текущее значение равно нулю при выполнении этого на стороне клиента.

1 Ответ

3 голосов
/ 02 апреля 2012

Исходя из вашего вопроса, я предполагаю, что вы хотите сопоставить сообщения In / Out любым способом - фреймворк предусматривает это:

В реализации IClientMessageInspector.BeforeSendRequest вы можете вернуть уникальный correlationState, который, в свою очередь, позволяет связать ответное сообщение в вашей реализации IClientMessageInspector.AfterReceiveReply, поскольку Framework вызовет вашу реализацию с вторым параметром.

РЕДАКТИРОВАТЬ - согласно комментариям ниже:

ЕСЛИ вам действительно нужно получить имя вызываемой операции / метода, вы могли бы сделать это путем реализации IClientMessageFormatter.SerializeRequest ИЛИ IParameterInspector - это позволит вам запишите, какой метод с какими параметрами был вызван и какой объект сообщения создан для него каркасом.

...