2009-12-06 10 views
15

Estoy tratando de obtener una mejor comprensión del proceso de despacho de WCF, en particular, el impacto y el efecto en los diversos puntos de extensibilidad. De las páginas web enumeradas en la parte inferior, parece que WCF hará lo siguiente en la secuencia indicada una vez que la pila de canales pasa un mensaje al despachador.¿Qué es el flujo de mensajes de la línea de despacho WCF?

  1. mensaje inspector
  2. Operación Selector
  3. mensaje de formateo
  4. Parámetro inspector
  5. Operación invocador.

Estoy tratando de encontrar algunas opciones para resolver un problema que tengo y una de las formas en que pienso es utilizar una combinación de Inspector de mensajes, Selector de operaciones, Formateo de mensajes y Operation Invoker. Por desgracia, mi observación parece indicar la secuencia de ejecución es el siguiente lugar:

  1. Operación Selector
  2. mensaje inspector
  3. Operación invocador (AllocateInputs())
  4. formato de mensajes
  5. Inspector de parámetros
  6. Opera ción Invoker (Invoke())

puedo entender la ligera diferencia donde un AllocateInputs invocador personalizado() método se llama antes de formatear el mensaje como la sección de mensajes de formatear se deserialising esencialmente el mensaje dado en un conjunto de argumentos del método para pasar a la operación apropiada y el método AllocateInputs() del invocador especifica cuántos parámetros se esperan.

La parte que me arroja es la inversión de secuencia entre Message Inspector y Operation Selector. Me parece lógico que los Inspectores de Mensajes se ejecuten primero a medida que actúan en el mensaje, mientras que el Selector de Operación determina a qué operación de servicio se dirige el mensaje.

Preguntas:

  • es que, debido a las diferentes versiones o ediciones de WCF?
  • ¿Esto se debe a que WCF no especifica realmente la secuencia de ejecución de los puntos de extensibilidad?

Páginas de referencia:
Extending WCF to support custom data formats - weblog de Zulfiqar
Extending WCF with Custom Behaviours - Estación de Servicio de MSDN de diciembre de de 2007
Message Flow Interception Points - Indigo Blog de Nicholas Allen

Nota: Mis disculpas por no proporcionar enlaces, puede' Tengo más de uno porque aún soy novato.=)

+1

Allí, he votado por su historia. Es posible que pueda publicar más de un enlace ahora, ya que tendrá 11 repeticiones ... tal vez: P –

+2

Agregue los enlaces para usted, @hg. – bobbymcr

+0

Ah ... No sabía que tiene que ver con el representante. Muchas gracias, @Crowe. Gracias @bobbymcr por poner los enlaces también. ¿Sería demasiado esperar algunas respuestas? =) –

Respuesta

5

Para determinar el orden real en el que se ejecuta el código, recomiendo activar Tracing para WCF y examinar los registros de seguimiento generados. Esto se puede activar mediante la adición de esta en el fichero de configuración:

<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> 

En cuanto a los puntos de extensibilidad de WCF, Carlos Figueira (uno de los ingenieros de WCF de Microsoft) tiene un post detallando casi todos los puntos de extensibilidad en WCF (http://blogs.msdn.com/b/carlosfigueira/archive/2011/03/14/wcf-extensibility.aspx).

En la sección WCF tiempo de ejecución de este post el orden aparece como tal:

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 

Creo que entre los dos el orden de las operaciones en WCF deben quedado claro.

Cuestiones relacionadas