Что такое поток сообщений диспетчерского конвейера WCF?
Я пытаюсь лучше понять процесс отправки WCF, в частности влияние и влияние на различные точки расширяемости. Из веб-страниц, перечисленных внизу, видно, что WCF будет выполнять следующие действия в указанной последовательности после передачи сообщения диспетчеру стека каналов.
- Инспектор сообщений
- Оператор выбора
- Форматирование сообщений
- Инспектор параметров
- Операция Invoker.
Я пытаюсь найти некоторые варианты для решения проблемы, которую я имею, и один из способов, о котором я думаю, это использовать комбинацию инспектора сообщений, селектора операций, форматирования сообщений и операции Invoker. К сожалению, мои наблюдения показывают, что последовательность выполнения выглядит следующим образом:
- Оператор выбора
- Инспектор сообщений
- Операция Invoker (AllocateInputs())
- Форматирование сообщений
- Инспектор параметров
- Операция "Инвокер" (Invoke())
Я могу понять небольшую разницу, когда пользовательский метод invloc AllocateInputs () вызывается перед форматированием сообщения, так как раздел "Форматирование сообщения" по существу десериализует данное сообщение в набор аргументов метода, которые должны быть переданы соответствующей операции и AllocateInputs вызывающего () метод указывает, сколько параметров ожидается.
Часть, которая бросает меня, - это инверсия последовательности между инспектором сообщений и селектором операций. Для меня кажется логичным, что сначала проверяются инспекторы сообщений, когда они воздействуют на сообщение, тогда как селектор операций определяет, для какой сервисной операции предназначено сообщение.
Вопросы:
- Это из-за разных версий или выпусков WCF?
- Это потому, что WCF на самом деле не определяет последовательность выполнения точек расширения?
Справочные страницы:
Расширение WCF для поддержки пользовательских форматов данных - блог Zulfiqar
Расширение WCF с помощью пользовательских поведений - MSDN Service Station Декабрь 2007 г.
Точки перехвата потока сообщений - блог Индиго Аллена
Примечание: мои извинения за то, что я не предоставляю ссылки, не может иметь больше одного, так как я все еще новичок. знак равно
1 ответ
Чтобы определить фактический порядок выполнения кода, я бы порекомендовал включить трассировку для WCF и просмотреть созданные журналы трассировки. Это можно включить, добавив это в файл конфигурации:
<configuration>
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="traceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "c:\log\Traces.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
</configuration>
Что касается точек расширения в WCF, у Карлоса Фигейры (одного из инженеров WCF в Microsoft) есть пост, в котором подробно описаны почти все точки расширения в WCF ( http://blogs.msdn.com/b/carlosfigueira/archive/2011/03/14/wcf-extensibility.aspx).
В разделе "Время выполнения WCF" этого поста порядок упорядочен следующим образом:
1.2. WCF Runtime
1.2.1. Message interception
1.2.1.1. I[Client/Dispatch]MessageInspector
1.2.1.2. IParameterInspector
1.2.2. Mapping between message and operation parameter
1.2.2.1. I[Client/Dispatch]MessageFormatter
1.2.3. Mapping between message and CLR operations
1.2.3.1. I[Client/Dispatch]OperationSelector
1.2.3.2. IOperationInvoker
1.2.4. Instance creation
1.2.4.1. IInstanceProvider
1.2.4.2. IInstanceContextProvider
1.2.5. Error handling
1.2.5.1. IErrorHandler
1.2.6. Others
1.2.6.1. ICallContextInitializer
1.2.6.2. IChannelInitializer
1.2.6.3. IInteractiveChannelInitializer
Я думаю, что между ними порядок операций в WCF должен стать понятным.