11
votes

Faire un seul support de service WCF Savon, repos et WSDL

J'essaie de construire un service C # dans .NET 3.5 qui prend en charge les deux savons - et montre le WSDL - et le repos.

Le service SOAP et la génération de la WSDL était suffisamment facile à utiliser avec le ServiceHost et un BasichttpLinding classes. Obtenu cela fonctionne et le client était heureux.

Parce que le savon appelle tous les paramètres simples utilisés, les développeurs de clients ont demandé une interface de repos pour certaines des commandes. J'ai donc changé la classe ServiceHost vers un WebserviceHost , a ajouté nécessaire webinvoke et webGet attributs, ajouté un webhttpbinding classe, et bingo - repos et savon travaillaient à la fois d'un service. Way Cool, changez une interface et le repos et le savon ont obtenu les nouvelles choses.

Mais un problème - le WSDL n'est plus généré. Je ne pouvais pas naviguer sur http: // serveur / service? WSDL et obtenir le fichier WSDL. Vérification des documents MSDN, qui semble être un comportement pour un WebServiceHost .

Question: Puis-je remplacer ce comportement afin que le WSDL puisse être obtenu? N'a pas à la même URL qu'auparavant - cela peut changer - mais je dois juste avoir une URL en service pour obtenir le WSDL pour ces développeurs de savon.


3 commentaires

problème similaire avec la solution. social.msdn.microsoft.com/ Forums / FR / WCF / Fil / ...


Bonjour Jason, j'aimerais savoir si vous utilisez toujours cette approche et comment sa fonctionne ou ne fonctionne pas pour vous. Vous constatez que vous devez dupliquer des méthodes (la logique principale) pour soutenir les deux?


Je devais juste créer deux points d'extrémité et ajouter un attribut supplémentaire à chaque commande.


3 Réponses :


4
votes

Lorsque vous dites "Ajout d'une classe webhttpbinding", on dirait que vous faites beaucoup de configuration dans le code par opposition aux fichiers de configuration.

Si tel est le cas, vous pouvez essayer de déplacer la configuration dans le fichier de configuration. Ensuite, créez 2 points de terminaison pour le contrat un repos et un savon, avec 2 adresses et liaisons différentes.


2 commentaires

Je fais toute la configuration dans le code, pas des fichiers de configuration. Une solution consiste à utiliser deux points d'extrémité - et cette solution fonctionne parfaitement. J'espérais utiliser un point final unique; un seul port et une URL racine.


Je ne pense pas que vous puissiez obtenir un WSDL d'un point d'extrémité WebhttpLinding.



4
votes

mais un problème - le WSDL n'est plus est généré. Je ne pouvais pas naviguer pour http: // serveur / service? WSDL et obtenez le Fichier WSDL. Vérification des docs MSDN, qui semble être un comportement pour un WebServiceHost par défaut.

Oui - c'est l'un des inconvénients du repos - plus WSDL, plus de description de service lisible par machine. Vous devez espérer que le fournisseur de services vous donne une documentation utilisable et à jour sur ce que vous pouvez faire.

Il n'y a pas de WSDL pour le repos - période. Ne peut pas être allumé ou quoi que ce soit - cela n'existe tout simplement pas.

Il y a des efforts en cours pour fournir quelque chose de similaire - appelé wadl (description de l'application Web Langue ), mais autant que je sache, il est encore loin d'une norme établie par quelque moyen que ce soit. Voir également: Avons-nous besoin de Wadl ?


1 commentaires

Je peux comprendre que le repos n'aurait aucune WSDL, mais gardez à l'esprit que le service gère les demandes de repos et de savon en même temps. C'est juste que les clients du savon ne peuvent plus demander un WSDL. L'objectif était de disposer d'un seul service, avec un seul port d'écoute pouvant servir à la fois le repos, le savon et le WSDL, tout en fonction de la voie de l'URL.



0
votes

CIRCA, 2007, WSDL V2.0 est censé pouvoir décrire des services reposants. J'ai constaté qu'avec WCF dans .NET V4.0, que le WDSL généré à partir d'un service purement reposant est invalide (WSDL V1.0?).

J'ai créé un projet similaire qui expose à la fois des points d'extrémité et des points d'extrémité reposants. Comme vous l'avez fait, modifier l'interface en tant que telle: p>

    // Get all Categories - complex object response
    [OperationContract]                             // categories
    [WebGet(BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "GetAllCategories")]
    CategoryCollection GetAllCategories();          // SubSonic object
    [OperationContract]                             // categories - respond with a JSON object
    [WebGet(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "GetAllCategories.JSON")]
    CategoryCollection GetAllCategoriesJSON();      // SubSonic object


1 commentaires

Existe-t-il un moyen d'exposer exactement la même méthode du savon et du repos au lieu d'ajouter une nouvelle méthode pour chaque méthode de savon ancienne?