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

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

  1. Инспектор сообщений
  2. Оператор выбора
  3. Форматирование сообщений
  4. Инспектор параметров
  5. Операция Invoker.

Я пытаюсь найти некоторые варианты для решения проблемы, которую я имею, и один из способов, о котором я думаю, это использовать комбинацию инспектора сообщений, селектора операций, форматирования сообщений и операции Invoker. К сожалению, мои наблюдения показывают, что последовательность выполнения выглядит следующим образом:

  1. Оператор выбора
  2. Инспектор сообщений
  3. Операция Invoker (AllocateInputs())
  4. Форматирование сообщений
  5. Инспектор параметров
  6. Операция "Инвокер" (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 должен стать понятным.

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