Problemas conocidos de los adaptadores de WCF
En este tema se describen los problemas conocidos de los adaptadores WCF incluidos con BizTalk Server.
Un mensaje que produce error en el procesamiento del cálculo de referencia de SOAP entrante no se suspende en los adaptadores de recepción WCF.
Cuando un mensaje llega a un adaptador de recepción WCF, el adaptador de WCF crea un mensaje de BizTalk desde el mensaje SOAP entrante y, a continuación, pasa el mensaje de BizTalk al proxy de transporte, administrado por el Gestor extremo. Si se produce un error en el adaptador al leer el sobre y el cuerpo SOAP durante la creación del mensaje de BizTalk, el mensaje no se suspende debido a que el adaptador usa el lector rápido, no almacenado en caché y progresivo para obtener acceso al mensaje SOAP.
Debe comprobar el mensaje con errores en el registro de eventos. Por ejemplo, puede usar una expresión de ruta de acceso del cuerpo en la pestaña Mensajes del cuadro de diálogo propiedades de transporte del adaptador wcF para especificar cómo crear el cuerpo del mensaje entrante de BizTalk a partir de un mensaje SOAP entrante a través del adaptador de WCF. Cuando se proporciona una expresión de ruta de acceso de cuerpo no válida para el mensaje SOAP entrante en la pestaña Mensajes , el adaptador no puede crear el mensaje de BizTalk y no puede suspender el mensaje entrante. Para obtener más información sobre cómo usar la expresión de ruta de acceso del cuerpo en la pestaña Mensajes , vea Especificar el cuerpo del mensaje para los adaptadores de WCF.
En la ilustración siguiente se muestra la pestaña Mensajes en la que puede especificar cómo crear mensajes entrantes de BizTalk a partir de los mensajes SOAP entrantes.
Un mensaje que produce error en el procesamiento del cálculo de referencia de SOAP entrante no se suspende en los adaptadores de envío WCF.
Un puerto de petición-respuesta de WCF puede recibir un mensaje WCF como mensaje de respuesta. Cuando el mensaje llega al adaptador de envío WCF, el adaptador de WCF crea el mensaje de BizTalk desde el mensaje SOAP entrante y, a continuación, pasa el mensaje de BizTalk al proxy de transporte, que es administrado por el Gestor extremo. Si se produce un error en el adaptador al leer el sobre y el cuerpo SOAP durante la creación del mensaje de BizTalk, el mensaje no se suspende debido a que el adaptador usa el lector rápido, no almacenado en caché y progresivo para obtener acceso al mensaje SOAP.
Debe comprobar el mensaje con errores en el registro de eventos. Por ejemplo, puede usar una expresión XPath en la pestaña Mensajes del cuadro de diálogo propiedades de transporte del adaptador wcF para especificar cómo crear el cuerpo del mensaje entrante de BizTalk a partir de un mensaje SOAP entrante a través del adaptador de WCF. Cuando se proporciona una expresión XPath no válida para el mensaje SOAP entrante en la pestaña Mensajes , el adaptador no puede crear el mensaje de BizTalk y no puede suspender el mensaje entrante. Para obtener más información sobre cómo usar la expresión XPath en la pestaña Mensajes , vea Especificar el cuerpo del mensaje para los adaptadores de WCF.
En la ilustración siguiente se muestra la pestaña Mensajes del adaptador de envío WCF-NetNamedPipe como ejemplo.
Los mensajes se pueden perder al usar OneWayBindingElement en un transporte bidireccional con enlace personalizado en ubicaciones de recepción no transaccionales WCF.
En una comunicación bidireccional, los adaptadores de WCF seguirán devolviendo la respuesta hasta que los mensajes no se hayan guardado en la base de datos de cuadro de mensajes. Sin embargo, el uso de OneWayBindingElement genera una respuesta ficticía inmediatamente antes de enviar el mensaje recibido al adaptador de WCF. Por lo tanto, si configura un enlace personalizado con oneWayBindingElement en la pila de canales para el transporte bidireccional en ubicaciones de recepción no transaccionales, los mensajes se pueden perder porque los adaptadores wcF procesan los mensajes recibidos de forma unidireccional.
Al construir los enlaces, se usan los valores predeterminados de los atributos de ReaderQuotas del cuadro de diálogo Propiedades de transporte de los adaptadores de WCF-Custom y WCF-CustomIsolated.
En los cuadros de diálogo WCF-Custom y WCF-CustomIsolated propiedades de transporte, los valores del atributo ReaderQuotas se muestran como cero. No obstante, al construir los enlaces, se usan los siguientes valores:
Atributo | Descripción | Value |
---|---|---|
maxArrayLength | Un entero positivo que especifica la longitud máxima permitida de matriz. | 16384 |
maxBytesPerRead | Un entero positivo que especifica el número máximo permitido de bytes devueltos por lectura. | 4096 |
maxDepth | Un entero positivo que especifica la profundidad máxima de anidación de nodos por lectura. | 32 |
maxNameTableCharCount | Un entero positivo que especifica el número máximo permitido de caracteres en un nombre de tabla. | 16384 |
maxStringContentLength | Un entero positivo que especifica el número máximo permitido de caracteres en el contenido de un elemento XML. | 8192 |
Las ubicaciones de recepción WCF pueden deshabilitarse si se cambia el tipo de adaptador de WCF y se mantiene la misma dirección.
Si cambia el tipo de adaptador (por ejemplo, cambia el tipo de adaptador wcF de WCF-NetTcp a WCF-Custom con el enlace netTcp) y mantiene la misma dirección, la ubicación de recepción puede deshabilitarse debido al problema de almacenamiento en caché en Endpoint Manager. Para solucionar este problema, puede llevar a cabo uno de los siguientes procedimientos:
Reiniciar el servicio BTSNTSvc.
Cambiar el URI a una dirección diferente y guardarlo y, a continuación, volver a cambiar el URI a la dirección original y volver a guardarlo.
La acción WCF establecida en la orquestación no sobrescribe la configuración de la acción del puerto de envío estático.
Si establece el WCF. Propiedad de contexto de acción en la orquestación, debe dejar el campo Acción en blanco en el cuadro de diálogo propiedades de transporte del adaptador wcF. Si también especifica una acción en el puerto de envío estático, WCF. La propiedad de contexto de acción establecida en la orquestación se invalidará por el valor establecido en el puerto de envío estático.
La propagación de un mensaje de error no es compatible en el envío transaccional.
La opción Propagar mensaje de error en los puertos de envío de solicitud-respuesta permite enrutar los mensajes que producen un error en el procesamiento saliente a una aplicación de suscripción. Sin embargo, si la casilla Habilitar transacciones también está activada en el cuadro de diálogo propiedades de transporte y la transacción se anula o no se puede usar cuando llega la respuesta de error al adaptador, no podrá propagar los mensajes de error a ninguna aplicación de suscripción.
El grupo de recursos de clúster MSMQ debe reiniciarse antes de que se reinicie el grupo de recursos de clúster Host de BizTalk durante la conmutación por error del clúster.
En un escenario de conmutación por error del clúster, cuando tiene lugar una conmutación por error, el grupo de recursos de clúster MSMQ debe reiniciarse antes de que se reinicie el grupo de recursos de clúster Host de BizTalk. Si se produce un error al hacerlo, puede que se deshabiliten las ubicaciones de recepción de MSMQ. Para solucionar este problema, puede hacer que el grupo de recursos de clúster BizTalk Host dependa del grupo de recursos de clúster de MSMQ para asegurarse de que el grupo de recursos de clúster MSMQ se inicie antes que el grupo de recursos de clúster BizTalk Host. De forma alternativa, puede reiniciar el grupo de recursos de clúster BizTalk Host para solucionar este problema.
Recibe un error al enviar mensajes a un Servicio WCF que use wsFederationHttpBinding en el extremo.
Recibe un error parecido al siguiente:
The adapter failed to transmit message going to send port "MySendPort" with URL "http://localohost/MywsFedHttp". It will be retransmitted after the retry interval specified for this Send Port. Details:"The channel is configured to use interactive initializer 'System.ServiceModel.Security.InfocardInteractiveChannelInitializer', but the channel was Opened without calling DisplayInitializationUI. Call DisplayInitializationUI before calling Open or other methods on this channel.".
Este comportamiento es así por diseño. Los adaptadores de WCF no pueden enviar mensajes a los servicios WCF que usan wsFederationHttpBinding en sus puntos de conexión.
El Asistente para consumición del Servicio WCF de BizTalk no permite seleccionar tipos de mensajes o tipos de puertos desde WSDL.
El Asistente para consumición del Servicio WCF de BizTalk no permite seleccionar tipos de mensajes o tipos de puertos desde WSDL al importar los servicios WCF. Para solucionar esta limitación, puede usar el siguiente código para obtener los esquemas y, a continuación, agregar los esquemas deseados a sus proyectos de BizTalk:
svcutil.exe /t:metadata http://service/metadataendpoint
El Asistente para consumición del Servicio WCF de BizTalk no permite la combinación de operaciones de petición-respuesta y unidireccionales.
El Asistente para consumición del Servicio WCF de BizTalk no permite importar los tipos de puerto que tengan una combinación de operaciones de petición-respuesta y unidireccionales. Para solucionar esto, puede usar la herramienta de utilidad de metadatos del modelo de servicio para generar los tipos de puerto.
El Asistente para consumición del Servicio WCF de BizTalk no permite establecer credenciales al recuperar el WSDL.
El Asistente para consumición del Servicio WCF de BizTalk no permite establecer credenciales de certificado al recuperar el WSDL. Para solucionar este problema, puede usar la Herramienta de utilidad de metadatos de ServiceModel para generar los archivos WSDL y XSD a partir de los servicios WCF que desea consumir con las credenciales de certificado establecidas en el archivo de svcutil.exe.config y, a continuación, importarlos en el Asistente para consumo de servicios WCF de BizTalk eligiendo Archivos de metadatos (WSDL y XSD) en la página Origen de metadatos .
Los adaptadores de WCF no admiten operaciones unidireccionales.
Recibirá un mensaje de error similar al siguiente al consumir servicios WCF publicados con los adaptadores WCF (excepto el adaptador de recepción WCF-NetMsmq) si la propiedad IsOneWay está establecida en true en el lado cliente. Esto se debe a que la propiedad System.ServiceModel.OperationContractAttribute.IsOneWay de los servicios WCF publicados con los adaptadores WCF (excepto los servicios publicados con el adaptador de recepción de WCF-NetMsmq) se establece en false incluso para las ubicaciones de recepción unidireccionales.
The channel received an unexpected input message while closing. Your Channel.Close() calls are not synchronized.
Recibirá un mensaje de error similar al siguiente al consumir los servicios WCF especificados con la propiedad IsOneWay establecida en true. Los mensajes enviados desde BizTalk Server se suspenderán y reanudarán.
The request operation at net.tcp://localhost:8088/MyService/tcp did not receive a reply within timeout 00:01:00.
Al enviar mensajes a colas MSMQ no transaccionales con el enlace WCF-NetMsmq, puede producirse una pérdida de memoria.
Al enviar mensajes a colas MSMQ no transaccionales con el enlace WCF-NetMsmq, puede producirse una pérdida de memoria en el servicio BizTalk NT. Esto puede producirse al enviar mensajes a una cola MSMQ no transaccional con el transporte WCF-NetMsmq o al enviar mensajes a una cola MSMQ no transaccional mediante el uso de netMsmqBinding con el transporte WCF-Custom.
Para resolver el problema, debe instalar la revisión de .NET Framework 3.0 que se describe en el artículo de KB 936512 en https://go.microsoft.com/fwlink/?LinkId=92962. La revisión no requiere un reinicio del sistema, pero es necesario reiniciar el servicio BizTalk NT que aloja los puertos de envío que usan el enlace WCF-NetMsmq.
Puede que reciba una excepción al comunicarse con servidores Web Apache con el adaptador de WCF-BasicHttp.
Al usar el adaptador de WCF-BasicHttp con la seguridad de transporte para comunicarse con un servidor Web Apache, puede que reciba excepciones similares a las siguientes:
System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send.
System.IO.IOException: Unable to write data to the transport connection: An established connection was aborted by the software in your host machine. System.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine
Para solucionar este problema, debe usar el adaptador de WCF-Custom en lugar del adaptador de WCF-BasicHttp para comunicarse con los servidores Web Apache de la siguiente manera:
Cree un puerto de envío y establezca el tipo de transporte en WCF-Custom.
En el cuadro de diálogo Propiedades de transporte personalizadas de WCF , en la pestaña Enlace , seleccione customBinding en la lista desplegable Tipo de enlace.
En CustomeBindingElement, haga clic con el botón derecho en httpTransport y, a continuación, haga clic en Quitar extensión.
Haga clic con el botón derecho en CustomeBindingElement y, a continuación, haga clic en Agregar extensión.
En el cuadro de diálogo Seleccionar extensión de elemento de enlace, seleccione httpTransport y, a continuación, haga clic en Aceptar.
Haga clic en httpTransport y, en el panel Configuración , establezca el valor de keepAliveEnabled en False.
Haga clic en textMessageEncoding y, a continuación, en el panel Configuración , establezca el valor de messageVersion
Soap11WSAddressing10
en .Puede que tenga que configurar propiedades adicionales según sea necesario.
BizTalk Server no funciona con clientes de WCF que usen ClientViaBehavior para conversaciones de varios saltos.
Los clientes de WCF usan ClientViaBehavior cuando el destino de red inmediato no sea el procesador intencionado del mensaje para habilitar conversaciones de varios saltos cuando la aplicación que realiza la llamada no tiene por qué saber el destino final. Si especifica ClientViaBehavior y establece la dirección de destino como un servicio remoto en el que BizTalk Server actuará como un intermediario, recibirá un mensaje de error parecido al siguiente:
The message with To 'net.tcp://localhost:5555/test.svc' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree