A publicação de mensagens de diversos schemas para o Biztalk, envolve um conjunto de questões.
Normalmente segue-se a abordagem de criar Web Services com os Schemas das mensagens usando o “Web Service Publishing Wizard”. Essa abordagem deve ser logo posta de parte, pois devido a um elevado número de tipos de mensagens, faz com que a criação de um Webservice por tipo de schema se torne impraticável.
Assim colocam-se dois problemas:
- Como criar um webservice genérico para publicar qualquer tipo de mensagem.
- Como fazer o “cast” da mensagem genérica para o tipo de mensagem propriamente dita, para poder ser consumida pelo subscritor respectivo.
Para criar um Web Service genérico, para qualquer tipo de mensagem:
- Executar o “Web Service Publishing Wizard”
- Seleccionar “Publish Schema as A Web Service”
- Remover “WebService1”
- Com o botão direito do rato, seleccionar “Add Web Service”
- Com o botão direito do rato, seleccionar WebService1 e seleccionar “web method, One-Way”
- Com o botão direito do rato, seleccionar o parametro “Request” e “Schema Type”
- Seleccionar qualquer dll com um schema (pode ser qualquer schema)
- Seleccionar “Next”
- Seleccionar “Create Biztalk Receive Locations”
- Seleccionar “Next”
- Seleccionar “Create”
- O Web Service é criado
O Wizard cria um Webservice para o Schema especificado, no próximo passo, irá alterar-se o mesmo para receber um tipo de mensagem genérico.
Editar o Web Service
- Abrir o Web Service criado
- Editar a assinatura do mesmo para parecer da seguinte forma: public void WebMethod1(System.Xml.XmlDocument part)
- Procurar pela linha que tem a criação da variável inParamInfos e alterar o typeof para System.Xml.XmlDocument.
Nota: Caso se tenha alterado o nome do parâmetro de entrada, também terá de se alterar o nome do mesmo após a instrução typeof - Alterar a variável bodyTypeAssemblyQualifiedName para string.empty
- Apagar os ficheiros DataTypes.cs e WsdlExtension.cs
- Compilar, invocar com um xml exemplo e verificar se a mensagem entra na MessageBox
Principal fonte http://geekswithblogs.com/sthomas/
Após o primeiro problema resolvido, resta-nos criar um processo de fazer "cast" das mensagens publicadas para um tipo conhecido, para facilitar o processo de subscrição.
A ideia partiu do meu colega João Martins (Jota), para tal só terá de se criar uma pipeline de receive, colocar na mesma uma Componente “Xml disassembler” e nas propriedades da mesma em “Document Schemas” colocar todos os Schemas de todos os tipos de mensagens que irão ser publicadas por este Web Service.
Nota: para evitar a publicação de tipos de mensagens não desejados, poderá também colocar-se a propriedade “Allow unrecognized message” a “false”.
Após a configuração e deploy da pipeline, só terá de se colocar o receive location do WebService a usar esta pipeline.
Após a implementação anterior, temos um Webservice que suporta a publicação de N tipos de mensagens.