É possível se comunicar com um sistema externo através de TCP / IP usando WCF?
-
03-07-2019 - |
Pergunta
Estamos construindo um sistema que interage com um sistema externo através de TCP / IP usando o FIX . Eu usei o WCF para se comunicar do cliente ao servidor, onde eu tinha controle sobre o cliente e servidor, mas nunca para um sistema baseado em TCP / IP externo. Isso é possível com WCF? Se assim for, a comunidade poderia fornecer links para mim para começar e enfrentou na direção certa?
Infelizmente não tenho muito mais informações que o que é fornecido acima, como ainda estamos nos primeiros estágios iniciais de planejamento. O que sabemos é que temos um fornecedor externo cujo sistema irá se comunicar com o nosso sistema através de TCP / IP. Nós gostaríamos de usar isso como uma oportunidade de aprendizagem e aprender WCF.
Solução
Eu não acho que isso é possível, pelo menos não vai ser fácil para configurá-lo, porque você não sabe o protocolo de comunicação da outra extremidade, exceto para ele do TCP e aceito etiquetas correção.
Por que não fazê-lo dentro de conexão TCP aberta aplicativo WCF um soquete. Isso deve fazer o truque de uma forma mais simples.
Outras dicas
Possível? Possivelmente sim, mas vai levar algum trabalho.
Para começar, você terá que escrever um costume WCF Transport Channel que pegas as especificidades de seus protocolos baseados TCP / IP (ou seja, você vai precisar para escrever tudo o soquete código de manipulação e gancho que no modelo de canal WCF). Isso ocorre porque o canal TCP no WCF não é para esse tipo de trabalho, mas usa um protocolo de fio relativamente proprietário e sem documentos.
Eu não sou suficientemente familiarizado com FIX para dizer o quão complexo seria, mas existem algumas armadilhas ao escrever canais WCF e documentação nessa área não é grande.
A segunda parte você terá que lidar com é a codificação de mensagens. Para WCF, todas as mensagens são XML. Isto é, uma vez que uma mensagem é passada para a pilha WCF, ele tem que olhar como um infoset XML em tempo de execução. CORRECÇÃO não usa XML (afaik), então você precisa para adaptá-la um pouco.
Há duas maneiras que você pode ir em torno dela:
-
A maneira mais fácil: Suponha que o servidor / cliente vai usar uma interface e formato específico para os dados, e ter o seu canal de fazer todo o trabalho duro de traduzir as mensagens FIX de / para esse formato. O exemplo mais simples disso seria ter o seu código WCF usar um contrato de serviço simples com um método tomando uma corda e depois é só encapsulando a cadeia de mensagem FIX para o formato XML que satisfaça os dados serializador contrato para contrato. O código do usuário ainda precisa lidar com a decodificação do formato FIX mais tarde, no entanto.
-
fazer todo o trabalho duro em um costume WCF MessageEncoder. É um pouco mais complexo, mas potencialmente mais limpa e reutilizável (e você poderia fazer coisas mais complexas como a melhor de streaming e assim por diante).
A grande questão, porém, é se isso vale a pena. Qual é o seu raciocínio para querer usar o WCF para isso? Aproveitando o modelo de programação? Eu acho que é uma consideração importante, mas também ter em mente que as abstrações que WCF fornece têm um preço. Em particular, alguns aspectos do WCF pode ser problemático se você tem requisitos de tempo real muito, que eu entendo é comum no tipo de ambiente financeiro que você está olhando.
Se for esse o caso, pode muito bem ser que você estaria melhor servido por pular WCF e furando um pouco mais perto do metal. Você precisa fazer o trabalho tomada de qualquer maneira, então isso é algo a considerar lá.
Espero que isso ajude:)
I pensar isso. Eu tenho um sistema que eu quase foi trabalho que deveria fazer quase exatamente isso (WCF através de HTTP a partir da Internet). O provedor de servidor parecia não deseja permitir que ele pensou assim que você vai precisar ter permissão naquele final para fazer o trabalho.
acima do tiro:. Não vejo por que não
Não é verdade -. Ms não fez o manipulador de conexão TCP / IP para conversar com serviços não-WCF, eles assumiram que você ia escrever um serviço web para fazer isso
Isto é discutido aqui no SO .