Question

J'ai une application Web déployée dans un fournisseur d'hébergement Internet. Cette application Web utilise un service WCF déployé sur un serveur IIS situé au serveur d'applications de mon entreprise, afin d'avoir accès aux données à la base de données de l'entreprise, les gars de réseau m'a permis d'exposer ce service WCF à travers un pare-feu pour des raisons de sécurité. Un diagramme ressemblerait à ceci.

  

[Page Hosted] ---> (Internet) ---> | Pare-feu <Public IP>:<Port-X > |   ---> [IIS avec service WCF <Comp. Network Ip>:<Port-Y>]

Je voulais aussi utiliser wsHttpBinding pour tirer parti de ses fonctions de sécurité, et chiffrer des informations sensibles.

Après l'essayer je reçois l'erreur suivante:

  

Détails de l'exception: System.ServiceModel.EndpointNotFoundException: Le   message avec A 'http: //: /service/WCFService.svc' ne peut pas être   traité au niveau du récepteur, en raison d'une incompatibilité de AddressFilter au   EndpointDispatcher. Assurez-vous que l'expéditeur et le destinataire   EndpointAddresses d'accord.

Faire des recherches j'ai découvert que wsHttpBinding utilise les standards WS-Addressing, et la lecture de cette norme j'ai appris que l'en-tête SOAP est améliorée pour inclure des balises comme « MessageID », « ReplyTo », « Action » et « A ».

Alors je devine que, parce que le critère d'application client spécifie l'adresse IP du pare-feu et le port, et le service répond par son adresse réseau interne qui est différent de l'adresse IP du pare-feu, WS-Addressing feu le message ci-dessus. Je pense que ce qui est une très bonne mesure de sécurité, mais il est pas tout à fait utile dans mon scénario.

mentionnant les WS-Addressing présentation standard ( http://www.w3.org/ soumission / ws adressage / )

  

"En raison de la gamme de technologies de réseau actuellement en utilisation à grande échelle   (Par exemple, NAT, DHCP, pare-feu), de nombreux déploiements ne peuvent pas attribuer une   significative URI globale à un point final donné. Pour permettre à ces « anonymes »   critères d'évaluation pour lancer des modèles d'échange de messages et recevoir des réponses,   WS-Addressing définit les éléments suivants URI bien connus pour une utilisation par   points d'extrémité qui ne peuvent pas avoir un URI stable, résoluble.    http://schemas.xmlsoap.org/ws/2004/08/ adressage / rôle / anonyme "

Comment puis-je configurer mon wsHttpBinding Endpoint pour adresse mes IP et d'ignorer ou contourner l'adresse indiquée dans le « To » étiquette WS-Addressing du pare-feu dans l'en-tête de message SOAP? Ou dois-je changer quelque chose dans ma configuration de point de terminaison de service?

Aide et conseils seront très appréciés.

Marko.

P.S .: Bien que je trouve une solution à cela, j'utilise basicHttpBinding absolument aucun problème bien sûr.

Était-ce utile?

La solution

Vous pouvez essayer de décorer votre classe de service avec:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

Autres conseils

Une façon plus sûre de gérer cela est de mettre le point final ListenUri au service Url, et le point de terminaison Adresse à l'extrémité externe où les clients envoient des messages. De cette façon, les messages de service « trusts » adressées uniquement à cette adresse, non seulement une adresse.

Je ne sais pas la solution de Mitch Baker, n'a jamais essayé. Mais cela implique de modifier le code généré. Il y a une autre façon de contourner le problème.

Je suppose que vous avez généré un code client à l'aide svcutil.exe, donnant une adresse MEX qui pointe vers le pare-feu. Lorsque vous faites cela, toute la configuration nécessaire est ajoutée à la App.config (ou web.config). Cependant, l'adresse dans la configuration du service pointer vers l'adresse de service réel (comme dans le fichier WSDL l'adresse du seuil de service est l'adresse du service réel).

Alors, ce que je pense va résoudre ce problème:

  1. Générer du code client en donnant l'adresse MEX (par exemple: http: //: Port-X / Service / wcfservice.svc wsdl?). Cette volonté a généré toute la configuration nécessaire.

  2. Lors de l'appel du constructeur client, donner l'URI du pare-feu en tant que EnpointAddress, et le nom de configuration de la configuration générée. De cette façon, le client envoie un message comme si elle envoyait au service, mais à l'adresse du pare-feu:

    client = new serviceclient (endpointConfigName, nouveau System.ServiceModel.EndpointAddress ( "http: //: Port-X / Service / wcfservice.svc"));

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top