web-dev-qa-db-fra.com

ASP.NET WebAPI + Soap

Est-ce que WebAPI prend en charge SOAP? J'essaie d'écrire un serveur SOAP dans MVC4 et bien que je puisse le faire dans WCF, il semble que WebAPI le remplace, mais je ne vois aucun moyen d'utiliser SOAP dans cet exemple, uniquement en JSON/XML. en utilisant une interface de style REST. 

27
John Mitchell

Pour citer Scott Guthrie: Ces dernières années ont vu l’essor des API Web - des services exposés via un simple HTTP plutôt que par le biais d’un contrat de service plus formel (comme SOAP ou WS *).

Donc je dirais non.

17
Sandman

L'API WEB est la réponse de Microsoft aux apis basés sur REST. Si vous voulez du savon, allez avec WCF.

14
Paolo del Mundo

WebApi ne prend pas en charge SOAP les solutions prêtes à l'emploi, en effet. Mais c’est un framework assez flexible et vous pouvez l’adapter pour gérer SOAP: rien ne vous empêche d’analyser manuellement les messages reçus SOAP (ils sont en clair après XML) et de générer manuellement les réponses sous forme de chaînes XML , puis en les envoyant avec l'en-tête de type de contenu approprié (vous pouvez même écrire votre propre formateur de contenu pour cela).

En fonction de vos besoins et de votre base de code existante, cela peut valoir la peine ou vous pouvez utiliser une technologie plus SOAP telle que WCF ou le cadre déjà mentionné ServiceStack .

6
Konamiman

Vous voudrez peut-être examiner ServiceStack , qui devrait prendre en charge à la fois SOAP et REST dans une interface sans tracas. Il prétend être un { meilleure correspondance que WebAPI pour les services Web } _.

Je ne peux pas prétendre tout savoir sur la différence, mais les problèmes qu'ils prétendent sont inhérents à l'approche API Web, je peux dire par expérience sont réels - l'évolution de l'API (inévitable dans un projet réel) est assez délicate dans le Web api. Et bien sûr, l’API Web ne prend pas en charge SOAP.

3
Eamon Nerbonne

Ce n’est pas comme si l’API Wed supportait SOAP mais, en raison de SOAP, c’est un standard qui utilise XML et qui se déplace via HTTP. Vous pouvez utiliser l’API Web pour exposer un service POST afin de et recherchez les nœuds dont vous avez besoin à l'aide de XPath, puis désérialisez les nœuds en objets.

Tout d’abord, vous devez ajouter le support XML à ConfigureServices.

public void ConfigureServices(IServiceCollection services)
    {

        services.AddMvc()
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
            .AddXmlSerializerFormatters();
    }

Ensuite, dans votre contrôleur, vous devez simplement ajouter une méthode qui reçoit un XMLDocument et avec XPath rechercher le nœud qui vous intéresse (essentiellement, supprimer l'enveloppe soap, l'en-tête, le corps) et ensuite vous pouvez désérialiser l'objet . Dans mon cas, j'ajoute la référence de service à l'aide du WSDL et avec cela, je désérialise l'objet.

[HttpPost("reservationxml")]
    public void CreateReservationFromTSW(XmlDocument soapCreateReservationRq)
    {
        XmlNamespaceManager nsmgr = new XmlNamespaceManager(soapCreateReservationRq.NameTable);
        nsmgr.AddNamespace("r", "http://soa.company.com/ReservationEnt");
        nsmgr.AddNamespace("s", "http://www.w3.org/2003/05/soap-envelope");

        XmlNodeList xmlNodeList = soapCreateReservationRq.SelectNodes("s:Envelope/s:Body/r:CreateReservationRq",nsmgr);
        XmlNode xmlnode = xmlNodeList[0];
        XmlSerializer serial = new XmlSerializer(typeof(ServiceReference1.CreateReservationRqType));
        ServiceReference1.CreateReservationRqType rq = (ServiceReference1.CreateReservationRqType)serial.Deserialize(new XmlNodeReader(xmlnode));


    }

Comme vous pouvez le voir dans l'image suivante, le service qui tente de consommer votre service utilise une méthode de requête POST avec Accept-Encoding: gzip. C'est pourquoi vous pouvez exposer une API Web pouvant être utilisée pour un service SOAP .  enter image description here

0
mavi