1. Introducción al modelo de canal:
Canal Pila: WCF para enviar y recibir mensajes de tubería mensaje de reanudación. Cada canal conjunto de pila tiene la oportunidad de procesar el mensaje, toda la pila puede editar el canal, puede ser insertado. Asegurar la flexibilidad.
modelo de canal y el aislamiento máximo cargo completo aislamiento, cualquiera de los servicios y el cliente se pueden configurar para un modelo de canal diferente. modelo de canal se puede dividir en superior e inferior dos partes: canales de protocolo se convierten anterior, los siguientes se convierten en el canal de transmisión. Un canal con una pluralidad de pilas puede ser el siguiente canal, pero en general, sólo un canal de transmisión, un canal de transmisión es responsable de codificar un mensaje enviado a ella extremo distal, el canal de transmisión que codifica pila codificador de canal requerida a continuación:
En general, el canal de protocolo responsable de qué función lógica no laborable del mensaje, incluyendo la transacción, día, mensajería y seguridad fiable,
Debe contener al menos un canal de transmisión y un codificador de canal, un canal de transmisión es responsable para codificar y transmitir mensajes. En concreto, el canal de transmisión a tratar de entender BindingContext objeto de encontrar que el codificador.
Si no puede encontrar el codificador se utiliza por defecto. Diferentes canales de transmisión que utilizan diferentes protocolos de transporte tales como: HTTP, TCP, IPC similares.
2. El patrón de intercambio de mensajes, y una forma de canal
los niveles de Mensajería: seis tipos de patrones de intercambio de mensajes:
En primer lugar, el modo datagrama
En segundo lugar, la solicitud - patrón de respuesta
Modo En tercer lugar, dúplex
El modo datagrama cuarto período de sesiones
En quinto lugar, la solicitud de sesión - patrón de respuesta
modo dúplex sexto período de sesiones
Un canal puede soportar una o modo interactivo varios, el canal al canal de modo interacción específica forma efectuar (forma de canal).
forma de canal se define pena enviar, recibir mensajes de acción de las interfaces 10, que se heredan de la interfaz ICHANNEL.
10 de los interfaces son: IInputChannel, IOutputChannel, IRequestChannel, IreplyChannel, IDuplexChannel, IInputSessionChannel, IOutputSessionChannel, IRequestSessionChannel, IReplySessionChannel, IDuplexSessionChannel.
3, datagrama modo: el remitente es responsable de enviar mensajes entre sí y recibir un mensaje de confirmación después de que el modo de interacción mensaje de finalización.
En este modo, el emisor puede determinar el mensaje único se envía correctamente. Correspondiente a si el mensaje finalmente llega al punto final, ya que además de ser exitosa, no saben cómo devolver un resultado. ilustración:
Ejemplo de código de envío de lado:
pública clase de salida { estática vacío principal ( string [] args) { // acumulación pila canal personalizado BindingElement [] = bindingElements nueva nueva BindingElement [ 3. ]; bindingElements [ 0 ] = nuevo nuevo TextMessageEncodingBindingElement (); // codificación de texto // bindingElements [. 1] = nuevo nuevo OneWayBindingElement (); // OneWayBindingElement de modo que el canal de transmisión puede soportar datagramas modo bindingElements [ . 3 ] = nuevo nuevo la HttpTransportBindingElement (); // el Http transmisión customBinding Encuadernación = nuevos nuevo customBinding (bindingElements); // 创建消息 usando (mensaje Mensaje = nueva Message.CreateMessage (binding.MessageVersion, " sendMessage " , " Cuerpo del mensaje " )) { // 创建ChannelFactory IChannelFactory <IOutputChannel> fábrica = binding.BuildChannelFactory <IOutputChannel> ( nuevo BindingParameterCollection ()); // Abrir ChannelFactory factory.Open (); // 创建IOutputChannel IOutputChannel outputChannel = factory.CreateChannel ( nuevo EndpointAddress ( " http: // localhost: 9090.InputService " )); // Abrir IOutputChannel outputChannel.Open (); // enviar outputChannel.Send (mensaje); Console.WriteLine ( " enviado con éxito la información " ); // 关闭IOutputChannel outputChannel.Close (); // 关闭ChannelFactory factory.Close (); } } }
Código de fin de recepción de muestras:
público de clase de entrada { estática vacío principal ( string [] args) { // crear y transmitir el mismo extremo del canal de pila BindingElement [] = bindingElements nuevo nuevo BindingElement [ 3. ]; bindingElements [ 0 ] = nuevo nuevo TextMessageEncodingBindingElement (); // codificación de texto // bindingElements [. 1] = nuevo nuevo OneWayBindingElement (); // OneWayBindingElement de modo que el canal de transmisión puede soportar datagramas modo bindingElements [ 2 ] = nuevo nuevo la HttpTransportBindingElement (); // el Http transmisión // Crear un enlace a medida customBinding la unión = nueva nueva customBinding (bindingElements); // 建立ChannelListner IChannelListener <IInputChannel> oyente = binding.BuildChannelListener <IInputChannel> ( nuevo Uri ( " http: // localhost: 9090 / InputService " ), nuevo BindingParameterCollection ()); listener.Open (); // 打开ChannelListner // 创建IInputChannel IInputChannel inputChannel = listener.AcceptChannel (); inputChannel.Open (); // Abrir IInputChannel Console.WriteLine ( " empezar a recibir información " ); Mensaje el Mensaje = inputChannel.Receive (); // recibir e imprimir información Console.WriteLine ( " recibe un mensaje, la acción es: {0}, el cuerpo 1} a {. " , Message.Headers.Action, message.GetBody < Cadena > ()); message.Close (); // Cerrar mensaje inputChannel.Close (); // cerrar el paso listener.Close (); // Cerrar oyente Console.Read (); } }
4. Solicitud - Modo de Respuesta: El cliente envía un mensaje y recibe un mensaje de respuesta para completar una interacción. modo dúplex especial. Este mensaje de modo debe ser iniciada por el cliente y el servidor acaba de regresar de un mensaje al cliente después de enviar un mensaje para detener el flujo actual y esperar a que el servidor para devolver un mensaje, éste se aplica al protocolo HTTP. Como se muestra en el modo interactivo:
Cumplir con la solicitud - modo de respuesta, los clientes necesitan para implementar servidor de interfaz IRequestChannel IReplyChannel necesidad de implementar la interfaz de código de ejemplo:
El remitente:
pública clase de salida { estática vacío principal ( string [] args) { BindingElement [] bindingElements = nuevo BindingElement [ 2 ]; bindingElements [ 0 ] = nuevo TextMessageEncodingBindingElement (); // 文本编码 bindingElements [ 1 ] = nuevo HttpTransportBindingElement (); // Http传输 // 自定义绑定 customBinding unión = nuevo customBinding (bindingElements); usando (mensaje Mensaje = Message.CreateMessage (binding.MessageVersion, " sendMessage " , " cuerpo de mensaje " )) { // 创建ChannelFactory IChannelFactory <IRequestChannel> fábrica = binding.BuildChannelFactory <IRequestChannel> ( nuevo BindingParameterCollection ()); factory.Open (); // ChannelFactory abierto // 创建IRequestChannnel IRequestChannel requestChannel = factory.CreateChannel ( nuevo EndpointAddress ( " http: // localhost: 9090 / RequestReplayService " )); requestChannel.Open (); // abrir un pasaje del Mensaje de respuesta = requestChannel.Request (Mensaje); // enviar mensaje Console.WriteLine ( " enviados correctamente un mensaje " ); // Comprobar mensaje devuelto Console.WriteLine ( " recibe una establece el mensaje de retorno, la acción es: {0}, el cuerpo es:. {} 1 " , response.Headers.Action, response.GetBody < cadena > ()); requestChannel.Close (); // cerrar el paso factory.Close (); // cerrar la fábrica } } }
El extremo receptor:
público de clase de entrada { estática vacío principal ( string [] args) { // crear y transmitir el mismo extremo del canal de pila BindingElement [] = bindingElements nuevo nuevo BindingElement [ 2 ]; bindingElements [ 0 ] = nuevo TextMessageEncodingBindingElement (); // 文本编码 bindingElements [ 1 ] = nuevo HttpTransportBindingElement (); // Http传输 // enlace personalizado customBinding Binding = nueva nueva customBinding (bindingElements); // 建立ChannelListner IChannelListener <IReplyChannel> oyente = binding.BuildChannelListener <IReplyChannel> ( nuevo Uri ( " http: // localhost: 9090 / RequestReplyService " ), nuevo BindingParameterCollection ()); listener.Open (); // supervisión abierto // 创建IReplyChannel IReplyChannel replyChannel = listener.AcceptChannel (); replyChannel.Open (); // abrir el canal Console.WriteLine ( " empezar a recibir mensajes .... " ); RequestContext RequestContext = replyChannel.ReceiveRequest (); Console.WriteLine ( " recibe un mensaje, la acción es: {0}, el cuerpo es: {1} " , requestContext.RequestMessage.Headers.Action, requestContext.RequestMessage.GetBody < cadena > ()); // 创建返回消息 respuesta de mensaje = Message.CreateMessage (binding.MessageVersion, " respuesta " , " cuerpo de la respuesta " ); // enviar un mensaje de retorno requestContext.Reply (respuesta); requestContext.Close (); replyChannel.Close (); // cerrar el paso listener.Close (); // Cerrar escucha } }
5, el modo dúplex: