Что такое поток сообщений конвейера отправки WCF

Я пытаюсь лучше понять процесс отправки WCF, в частности, влияние и влияние на различные точки расширяемости. На приведенных ниже веб-страницах показано, что WCF будет выполнять следующие действия в указанной последовательности, как только сообщение передается диспетчеру в стеке каналов.

  • Инспектор сообщений
  • Селектор операций
  • Форматирование сообщений
  • Инспектор параметров
  • Операция Invoker.

Я пытаюсь найти некоторые варианты решения проблемы, которую я имею, и один из способов, о котором я думаю, - использовать комбинацию Message Inspector, Operation Selector, Message Formating и Operation Invoker. К сожалению, мое наблюдение, похоже, указывает, что последовательность выполнения выглядит следующим образом:

  • Селектор операций
  • Инспектор сообщений
  • Операция Invoker (AllocateInputs())
  • Форматирование сообщений
  • Инспектор параметров
  • Операция Invoker (Invoke())

Я могу понять небольшую разницу, когда вызываемый пользовательский метод AllocateInputs() вызывается перед форматированием сообщения, поскольку раздел форматирования сообщений по существу десериализует данное сообщение в набор аргументов метода, которые должны быть переданы в соответствующую операцию, и invoke AllocateInputs() определяет, сколько параметров ожидается.

Часть, которая меня бросает, - это инверсия последовательности между Message Inspector и Operation Selector. Мне кажется логичным для меня, когда Message Inspectors запускаются сначала, когда они действуют над сообщением, тогда как Operation Selector определяет, какая служебная операция предназначена для сообщения.

Вопросы:

  • Это из-за разных версий или выпусков WCF?
  • Это потому, что WCF фактически не указывает последовательность выполнения точек расширения?

Страницы справки:
Расширение WCF для поддержки пользовательских форматов данных - Zulfiqar weblog
Расширение WCF с пользовательскими настройками - Станция обслуживания MSDN Декабрь 2007
Точки перехвата потока сообщений - Блог пользователя Nicholas Allen Indigo

Примечание. Мои извинения за отсутствие ссылок, не могут быть более одного, так как я все еще ноб. =)

Ответы

Ответ 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).

В разделе Runtime 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 должен стать ясным.