27 votes

Problème de configuration et d'hébergement WCF WebService / IIS derrière un pare-feu

J'ai un service Web WCF simple. Il est hébergé sur IIS sous le site Web par défaut de notre domaine de production. (adresse locale : 10.10.20.100)

Par défaut, ce site Web par défaut était configuré pour les IP "Toutes les affectations" sur le port 80 : cependant, j'ai remarqué que cela faisait générer au service WCF son WSDL en utilisant le nom DNS local du serveur. c'est-à-dire que toutes les URIs dans le wsdl étaient

http://monserveur.sous-domaine.domaine.com/.../...

Ce n'était pas bon car je dois exposer ce service à des sites qui n'ont aucune connaissance du DNS interne des environnements de production. Et ce serveur particulier n'a pas de nom DNS externe. Juste une adresse IP externe...

J'ai eu du succès en modifiant le paramètre dans IIS de "Toutes les affectations" -> "10.10.20.100"

Cela fait générer le WSDL du service avec les URIs

http://10.10.20.100/.../...

C'est bien pour d'autres machines dans le sous-domaine et sur d'autres sous-domaines mais c'est ici que je reste bloqué. L'adresse IP externe du serveur (1.2.3.4) est mappée via une certaine traduction NAT/PAT donc elle n'est pas configurée explicitement dans les paramètres IP du serveur (c'est-à-dire qu'elle n'apparaît pas sous Config IP)

Donc si je change l'adresse IP du site Web par défaut d'IIS de "Toutes les affectations" -> "1.2.3.4" comme je l'ai fait pour l'adresse interne, alors le service WCF renvoie simplement...

Requête incorrecte (Nom d'hôte non valide)

Et si je laisse IIS configuré sur l'adresse IP interne, et que j'essaie d'accéder au service via l'adresse IP externe, j'obtiens

Aucune correspondance de liaison de protocole pour l'adresse donnée 
'http://1.2.3.4/TestService/Service.svc'. Les liens de protocole sont 
configurés au niveau du Site dans la configuration d'IIS ou WAS

Y a-t-il un moyen de faire générer au WSDL de l'IIS/WCF ses URIs avec une adresse IP externe qui n'est pas configurée explicitement sur le serveur ?

Quelqu'un peut-il m'aider s'il vous plaît avant que je fasse voler les services WCF par la fenêtre.

8voto

Joshua Belden Points 3492

C'est parce que vous n'avez pas défini vos en-têtes d'hôte. Cela semble être un problème extrêmement courant, je le rencontre tout le temps. Il n'y a pas de configuration pour les URI qu'il génère, il recherche la bonne adresse en examinant l'en-tête d'hôte du site. Même s'il est dans un répertoire virtuel, vous devez aller au parent, dans votre cas, le répertoire par défaut, et ajouter un en-tête d'hôte.

Dites-moi si vous ne savez pas comment faire cela.

1voto

Steve Points 666

Je pourrais être en mesure de prévenir la violence des ninjas... si je comprends votre problème... Vous pouvez spécifier manuellement l'adresse complète que le service doit utiliser dans le fichier web.config au lieu de laisser ServiceHost le déterminer pour vous. Vous devez définir l'adresse de base de votre service :

En utilisant cette méthode, votre service devrait accepter l'adresse de base spécifiée, plus le nom du service, avec l'adresse de point de terminaison supplémentaire si vous en avez une. De plus, vous devriez utiliser une fabrique de ServiceHost personnalisée pour définir l'adresse de base de manière programmatique. Voir ci-dessous :

    public class ServiceHostFactory : System.ServiceModel.Activation.ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {                        
        ServiceHost host;

        host = new ServiceHost(serviceType, baseAddresses[0]);

        return host;
    }

Enfin, une fois que vous avez créé la classe ServiceHostFactory, vous devez la connecter à votre service en modifiant le balisage dans le fichier .svc :

<%@ ServiceHost Language="C#" Debug="true" Service="Api.Poll" Factory="Api.ServiceHostFactory" CodeBehind="Poll.svc.cs" %>

1voto

blowdart Points 28735

Doit-il s'agir d'une adresse IP et non d'un FQDN? En basculant vers un FQDN et en le définissant dans les en-têtes d'hôte du site, puis en le liant via

cscript //nologo %systemdrive%\inetpub\adminscripts\adsutil.vbs set W3SVC/1/ServerBindings ":80:hostname.example.com"

puis en recyclant le pool d'applications, le nom d'hôte sera alors généré dans le WSDL. Vous obtenez des avantages avec cela - vous pouvez configurer un DNS interne qui résout ce FQDN vers l'IP interne, et un DNS externe qui résout vers votre IP de pare-feu, puis le même système fonctionnera sans aucun changement.

1voto

Vilhelm Points 11

Voici comment vous pouvez changer l'en-tête dans IIS7. Mettez aussi mon web.config si cela peut aider.

http://www.sslshopper.com/article-ssl-host-headers-in-iis-7.html

1voto

Thomas Bindzus Points 371

Même si c'est un vieux fil de discussion, il m'a en fait aidé à migrer un projet de VS Web Developer Express vers MonoDevelop qui incluait un service WCF.

L'application web demandait l'interface JavaScript définie par le service WCF en utilisant l'URL suivante : http://127.0.0.1:8080/path-to-service/service.svc/js, ce qui m'a donné l'erreur : Aucune correspondance de protocole de liaison ne correspond à l'adresse donnée

Inspiré par ce fil de discussion, j'ai pu résoudre le problème car l'accès au service avec localhost au lieu de 127.0.0.1 a fonctionné ! Avec une requête à http://localhost:8080/path-to-service/service.svc/js j'ai obtenu l'interface JavaScript.

En fait, mon application n'utilisait pas une URL absolue pour inclure l'interface JavaScript, cependant par défaut, lors du démarrage de l'application depuis MonoDevelop, elle accédait à l'application en utilisant 127.0.0.1, donc l'appel pour inclure du JavaScript depuis le service échouait.

Ce n'est toujours pas parfait car je n'ai pas pu démarrer l'application depuis MonoDevelop en utilisant localhost au lieu de 127.0.0.1, puisque la configuration pour XSP ne me permet de spécifier qu'une adresse IP, mais au moins je sais comment contourner le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X