2008-12-11 21 views
4

J'ai une application Web déployée dans un fournisseur d'hébergement Internet. Cette application web consomme un service WCF déployé sur un serveur IIS situé sur le serveur d'application de mon entreprise, afin d'avoir accès à la base de données de l'entreprise, les gars du réseau m'ont permis d'exposer ce service via un firewall. Un diagramme ressemblerait à ceci. Je voulais également utiliser wsHttpBinding pour tirer parti de ses fonctions de sécurité et crypter des informations sensibles.Problème intéressant avec WCF wsHttpBinding à travers un pare-feu

après l'avoir essayé, je reçois l'erreur suivante:

Exception Details: System.ServiceModel.EndpointNotFoundException: The message with To 'http://:/service/WCFService.svc' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree.

Faire quelques recherches, j'ai découvert que wsHttpBinding utilise WS-Addressing normes, et la lecture de cette norme j'ai appris que l'en-tête SOAP est amélioré pour inclure des balises telles que 'MessageID', 'ReplyTo', 'Action' et 'To'. Étant donné que le point de terminaison de l'application cliente spécifie l'adresse IP et le port du pare-feu et que le service répond avec son adresse réseau interne différente de celle du pare-feu, l'adressage WS déclenche le message ci-dessus. Ce que je pense c'est une très bonne mesure de sécurité, mais ce n'est pas très utile dans mon scénario.

Citant le WS-Addressing soumission norme (http://www.w3.org/Submission/ws-addressing/)

"Due to the range of network technologies currently in wide-spread use (e.g., NAT, DHCP, firewalls), many deployments cannot assign a meaningful global URI to a given endpoint. To allow these ‘anonymous’ endpoints to initiate message exchange patterns and receive replies, WS-Addressing defines the following well-known URI for use by endpoints that cannot have a stable, resolvable URI. http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous "

Comment puis-je configurer mon wsHttpBinding Endpoint pour adresser mon IP de pare-feu et d'ignorer ou contourner l'adresse indiquée dans les 'To' WS-Addressing tag dans l'en-tête du message SOAP? Ou dois-je modifier quelque chose dans la configuration de mon point de terminaison de service?

Une aide et des conseils seront très appréciés.

Marko.

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

Répondre

5

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

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)] 
2

Je ne sais pas la solution de Mitch Baker, jamais essayé. Mais cela implique de modifier le code généré. Il y a un autre moyen de contourner cela.

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

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

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

  2. Lors de l'appel du constructeur client, indiquez l'URI du pare-feu en tant qu'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 "));

4

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, le service "approuve" les messages dirigés uniquement vers cette adresse, et pas seulement n'importe quelle adresse.

+0

+1 - Cependant, je ne comprends toujours pas comment cela fonctionnera pour les services déployés sur plusieurs serveurs derrière Load Balancers. Je suis passé par ce grand poste de vous déjà http://www.devproconnections.com/article/net-framework2/wcf-and-ssl-processing-load-balancers-122238 – VoodooChild

+0

Ceci est la bonne façon de le faire. Votre administrateur réseau doit diriger les demandes du pare-feu vers le serveur sur lequel votre service est hébergé et vous devez définir listenUri dans le fichier web.config pour répondre aux demandes dirigées. J'ai de nombreux services hébergés sur plusieurs serveurs avec des équilibreurs de charge configurés comme ça. Cette configuration fonctionne également avec les terminateurs SSL. –