2012-08-16 9 views
7

Estoy tratando de comprender mejor algunos de los mecanismos internos de WCF. He revisado bastante, pero no he podido encontrar una explicación clara de lo que hace ChannelFactory.Open() en comparación con IClientChannel.Open(). ¿Cuál es el propósito de abrir la fábrica? Si el canal se utiliza para la comunicación, ¿qué parte juega la fábrica en el proceso una vez que se ha creado y abierto el canal?ChannelFactory.Open VS IClientChannel.Open

La pregunta fue here, entre otras preguntas, pero nunca respondió directamente.

EDIT:

Después de-compilar el código fuente, he encontrado algunas de las razones específicas por las necesidades Abiertas a ser llamados ChannelFactory, que se documenta a continuación.

Lo que todavía tengo problemas para entender es por qué este trabajo se realiza a través de mecanismos proporcionados por el ICommunicationObject, cuando la fábrica no se está comunicando con nada (hasta donde yo sé). ¿Por qué no manejar estas cosas solo cuando el objeto se construye o se desecha?

Creo que estoy lo suficientemente alejado como para que tal respuesta no esté disponible públicamente. Gracias a aquellos que intervinieron en la pregunta original.

Respuesta

1

Después de compilar varias de las clases relacionadas en System.ServiceModel, pude obtener un poco más de información.

La llamada Open parece avanzar por el árbol de herencia al CommunicationObject, donde se llama al método Open. Todo lo que parece hacer es proporcionar un montón de información de diagnóstico y plantear una serie de eventos.

La clase ChannelFactory utiliza los eventos abiertos hacer una serie de cosas, incluyendo la creación de su fábrica canal interno:

protected override void OnOpening() 
{ 
    base.OnOpening(); 
    this.innerFactory = this.CreateFactory(); 
    if (this.innerFactory == null) 
    { 
     throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidOperationException(SR.GetString("InnerChannelFactoryWasNotSet"))); 
    } 
} 

Como ha sido mencionado por otros aquí, los eventos Close también se utilizan para hacer cosas como cerca todos los canales subyacentes, (a través de su fábrica de canales internos):

protected override void OnClose(TimeSpan timeout) 
{ 
    TimeoutHelper timeoutHelper = new TimeoutHelper(timeout); 
    while (true) 
    { 
     IChannel channel; 
     lock (base.ThisLock) 
     { 
      if (this.channelsList.Count == 0) 
      { 
       break; 
      } 
      channel = this.channelsList[0]; 
     } 
     channel.Close(timeoutHelper.RemainingTime()); 
    } 
} 
0

ChannelFactory apertura o el innerchannel acaba de cambiar el estado del objeto, cuando se crea una instancia es comienza en el estado Creado, el objeto puede ser configurado pero no es utilizable para enviar o recibir mensajes, en el estado abierto, la CommunicationObject es utilizable pero ya no es configurable

Por lo tanto, el propósito de abrir la fábrica es solo una opción de diseño y de hecho se hace automáticamente cuando crea el primer canal, no es demasiado bajo el capó, la fábrica es responsable para crear el canal que traerá mensajes de la capa de transporte y los enviará a su aplicación.

Las fábricas de canales son responsables de la creación de canales. Los canales creados por fábricas de canales se utilizan para enviar mensajes. Estos canales son responsables de obtener el mensaje de la capa superior, realizando cualquier procesamiento que sea necesario, y luego enviar el mensaje a la capa siguiente. El siguiente gráfico ilustra este proceso

http://msdn.microsoft.com/en-us/library/ms789050.aspx

Esperanza esto ayuda

+0

Gracias por la respuesta. ¿Puedes dar más detalles sobre el propósito de abrir la fábrica? Usted dijo: "Por lo tanto, el propósito de abrir la fábrica es solo una opción de diseño y, de hecho, se realiza automáticamente cuando se crea el primer canal, no es demasiado bajo el capó". Estoy tratando de entender por qué la fábrica debe abrirse en absoluto. ¿Por qué hicieron esta elección de diseño? ¿Para qué sirve? ¿Por qué la fábrica implementa ICommunicationObject cuando también se usa para crear un canal que lo implementa también? –

+0

Lo siento, pero no sé por qué Microsoft hizo esta elección porque no (y creo que no puedo) saber cómo se implementa ChannelFactory y tampoco el canal que crea, espero que si alguien sabe más acerca de eso va a dejar nosotros sabemos :) – MaRuf

6

abierto tiene que ser llamado en la fábrica, ya que es un ICommunicationObject - antes de utilizar uno de esos, que tiene que ser abierto . Pero en la mayoría de los casos, la fábrica se abre automáticamente cuando llamas cosas como CreateChannel, por ejemplo, por lo que casi nunca tienes que preocuparte de abrir explícitamente la fábrica.

En cuanto a Cerrar, realmente depende de qué encuadernación está usando la fábrica. En la mayoría de los casos está en lo cierto, el recurso está principalmente asociado con el canal. Pero es posible que cierto enlace multiplexe múltiples canales en la misma conexión subyacente, por lo que al cerrar el canal simplemente se eliminaría el canal de la lista que se va a multiplexar. Solo cuando la fábrica está cerrada es porque la conexión subyacente se ha liberado.

+0

Gracias por su respuesta, Cybermaxs. No estoy familiarizado con la multiplexación, y no encontré mucha ayuda después de buscar en Google. ¿Podría indicarme dónde podría encontrar información y cómo la fábrica de canales gestiona las conexiones subyacentes en esos casos? Además, actualicé mi pregunta con información adicional y una pregunta más específica si tiene más ideas allí. –

Cuestiones relacionadas