Pergunta

Tenho uma aplicação web implantado em um provedor de hospedagem internet. Esta aplicação web consome um serviço WCF implantado em um servidor IIS localizada no servidor de aplicativos da minha empresa, a fim de ter acesso a dados no banco de dados da empresa, os caras da rede permitiu-me para expor este serviço WCF através de um firewall por razões de segurança. Um diagrama ficaria assim.

[página Hospedado] ---> (Internet) ---> | Firewall <Public IP>:<Port-X > | ---> [IIS com <Comp. Network Ip>:<Port-Y> WCF Serviço]

Eu também queria usar wsHttpBinding para tirar proveito de seus recursos de segurança e informações sensíveis criptografar.

Depois de testá-lo eu recebo o seguinte erro:

Exceção detalhes: System.ServiceModel.EndpointNotFoundException: O mensagem com a 'http: //: /service/WCFService.svc' não pode ser processados ??no receptor, devido a uma incompatibilidade na AddressFilter EndpointDispatcher. Verifique se o emissor eo receptor de EndpointAddresses concordar.

Fazer alguma pesquisa descobri que usa WSHttpBinding WS-Addressing normas, e lendo sobre isso eu padrão aprendi que o cabeçalho SOAP é reforçada para incluir tags como 'MessageID', 'ReplyTo', 'Ação' e 'Para'.

Então, eu estou supondo que, porque o endpoint aplicativo cliente especifica o endereço Firewall IP e Porta, e as respostas de serviços com seu endereço de rede interna, que é diferente do IP do Firewall, em seguida, WS-Addressing incêndios a mensagem acima. Que eu acho que é uma medida de segurança muito bom, mas não é muito útil no meu cenário.

Citando a apresentação padrão WS-Addressing ( http://www.w3.org/ Submission / WS-Addressing / )

"Devido à gama de tecnologias de redes actualmente generalizado de uso (Por exemplo, NAT, DHCP, firewalls), muitas implementações não pode atribuir um URI mundial significativo para um determinado parâmetro. Para permitir que esses ‘anonymous’ endpoints para iniciar padrões de troca de mensagens e receber respostas, define WS-Addressing o seguinte conhecido URI para uso por endpoints que não podem ter uma união estável, resolúvel URI. http://schemas.xmlsoap.org/ws/2004/08/ endereçamento / papel / anônimo "

Como posso configurar meu wsHttpBinding Endpoint para o endereço IP do meu Firewall e ignorar ou ignorar o endereço especificado na tag ‘para’ WS-Addressing no cabeçalho da mensagem SOAP? Ou eu tenho que mudar alguma coisa na minha configuração terminal de serviço?

Ajuda e orientação será muito apreciado.

Marko.

P.S .: Enquanto eu encontrar alguma solução para isso, eu estou usando basicHttpBinding com absolutamente nenhum problema, claro.

Foi útil?

Solução

Você pode tentar decorar a sua classe de serviço com:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

Outras dicas

A mais segura maneira de lidar com isso é para definir o ponto final listenUri ao serviço Url, eo endpoint endereço para o ponto final externo, onde os clientes enviar mensagens. Desta forma, o serviço "trusts" mensagens dirigidos apenas para esse endereço, não apenas qualquer endereço.

Eu não sei sobre a solução de Mitch Baker, nunca tentei. Mas se trata de alterar o código gerado. Há uma outra maneira de contornar isso.

Eu suponho que você gerado o código do cliente usando svcutil.exe, dando um endereço MEX que aponta para o firewall. Quando você fizer isso, toda a configuração necessária é adicionado ao App.config (ou Web.config). No entanto, o endereço do serviço na configuração irá apontar para o endereço do serviço real (como no arquivo WSDL o endereço do serviço Sill ser o endereço do verdadeiro serviço).

Então, o que eu acho que vai resolver esse problema:

  1. Gerar o código do cliente, dando o endereço MEX (por exemplo: http: //: Port-X / serviço / wcfservice.svc wsdl?). Este será gerado toda a configuração necessária.

  2. Ao invocar o construtor cliente, dar o URI do firewall como o EnpointAddress, e o nome da configuração da configuração gerado. Desta forma, o cliente irá enviar uma mensagem como se fosse enviá-lo para o serviço, mas ao endereço do firewall:

    cliente = new ServiceClient (endpointConfigName, novo System.ServiceModel.EndpointAddress ( "http: //: Port-X / serviço / wcfservice.svc"));

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top