Introducción
Una de las interesantes características de BizTalk es la habilidad de usar WCF para realizar la publicación de servicios.
Esto junto a la capacidad de WCF de publicar servicios
relay nos permite habilitar aplicaciones híbridas, las que exponen sus extremos en la nube de forma segura y el procesamiento de los mensajes se realiza de forma local sin tener que realizar mayores configuraciones en las redes corporativas.
BizTalk Server cuenta con un conjunto de adaptadores out-the-box que realizan el trabajo,
WCF-BasicHttpRelay,
WCF-NetTcpRelay.
Problema
Se requiere que un servicio BizTalk retorne una excepción personalizada, lo que requiere agregar al endpoint un componente que implemente la interface
IErrorHandler lo que permite el manejo personalizado de la excepción retornada al cliente, un ejemplo de esto en el
blog - How to Throw Typed Fault Exceptions from Orchestrations Published as WCF Services.
Este enpoint, que implementa este comportamiento especifico, debe ser publicado usando un WCF Relay, por lo que es necesario agregar a la pila de componentes utilizados en el endpoint relay el manjedador de errores personalizado, lo que no es posible, la única opción es utilizar uno de los adaptadores custom disponibles, el problema es que estos adaptadores custom no tienen disponibles los bindings relays necesarios para la configuración del enpoint en el service bus.
Solución
Lo primero que debemos hacer es obtener la dll que implementa los bindings que vamos a utilizar, estos binding se encuentran contenidos en el paquete nuget
WindowsAzure.ServiceBus una vez que hemos obtenido los componentes necesitamos registarlos en la GAC, en este paso tenemos dos opciones usamos el comando gacutil o los agregamos como recurso a BizTAlk marcando durante la importación el registro en la GAC.
una vez registrado los componentes necesarios en la GAC, el siguiente paso es realizar el registro de las extensiones en los archivos de configuración
machine,config, BTSNTSvc.exe.config y BTSNTSvc64.exe.config
la configuración a incluir es la siguiente
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="btsWsdlExporter" type="Microsoft.BizTalk.Adapter.Wcf.Metadata.BtsWsdlExporterElement, Microsoft.BizTalk.Adapter.Wcf.Runtime, Version=[VERSION], Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add name="transportClientEndpointBehavior" type="Microsoft.ServiceBus.Configuration.TransportClientEndpointBehaviorElement, Microsoft.ServiceBus, Version=[VERSION], Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add name="serviceRegistrySettings" type="Microsoft.ServiceBus.Configuration.ServiceRegistrySettingsElement, Microsoft.ServiceBus, Version=[VERSION], Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</behaviorExtensions>
<bindingExtensions>
<add name="netTcpRelayBinding" type="Microsoft.ServiceBus.Configuration.NetTcpRelayBindingCollectionElement, Microsoft.ServiceBus, Version=[VERSION], Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add name="ws2007HttpRelayBinding" type="Microsoft.ServiceBus.Configuration.WS2007HttpRelayBindingCollectionElement, Microsoft.ServiceBus, Version=[VERSION], Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add name="basicHttpRelayBinding" type="Microsoft.ServiceBus.Configuration.BasicHttpRelayBindingCollectionElement, Microsoft.ServiceBus, Version=[VERSION], Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<add name="webHttpRelayBinding" type="Microsoft.ServiceBus.Configuration.WebHttpRelayBindingCollectionElement, Microsoft.ServiceBus, Version=[VERSION], Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</bindingExtensions>
</extensions>
</system.serviceModel>
Una vez registrados las extensiones, ya podemos realizar la configuración de la receive location, a modo de ejemplo utilizaremos en este caso el adaptador WCF-Custom.
Lo primero es aprovisionar en el portal de azure el servicio Relay, la forma mas sencilla es realizar la busqueda mediante la palabra Relay.
lo que nos permitirá crear en namespace con las opciones dedicadas al hospedaje de servicios relays y conexiones híbridas.
una vez aprovisionado el namespace procedemos a realizar la configuración del receive location, para esto desde la consola de administración de BizTalk debemos agregar un nuevo request-response receive port, dentro de este receive port agregamos una nueva recceive location de tipo WCF-Custom.
En la configuración del adaptador debemos poner da URl del extremo que estamos configurando ej:
https://MyPoCService.servicebus.windows.net/myendpoint/myservice.svc.
El siguiente paso es seleccionar el binding que utilizaremos, de la lista de relays disponibles utilizaremos para este ejemplo basicHttpRelayBinding.
Para el ejemplo publicaremos el servicio en el bus de servicios sin seguridad, por defecto el binding utiliza la opción RelayAccessToken la que implementa la seguridad en el lado del cliente.
El siguiente paso es agregar y configurar las behaviors que el servicio utilizará, como service Behavior agregaremos:
- ServiceThrotting
- CustomErrorHandler (componente personalizado de manejo de excepciones - opcional)
y como endpoint behaviors agregaremos
- TransporClientEndpointBehavior
- ServiceRegistrySettings
A continuación, revisaremos solo la configuración de los componentes agregados en la sección endpoints behavior.
lo primero a revisar es el componente TransporClientEndpointBehavior en este componente debemos agregar los valores que obtenemos desde el portal bajo la opción Shared access policies.
Tal como se muestra en la figura.
El segundo componente a revisar es ServiceRegistrySettings en donde debemos especificar el modo de registro, en este caso seleccionaremos Public.
ya realizada la configuración iniciamos la receive location, si todo anda bien en el portal deberemos ver el endpoint registrado.