web-dev-qa-db-de.com

ASP.NET WebAPI + Soap

Unterstützt WebAPI SOAP? Ich versuche, einen SOAP -Server in MVC4 zu schreiben, und obwohl ich dies in WCF tun kann, scheint WebAPI dies zu ersetzen, aber ich sehe noch keine Möglichkeiten, SOAP hier zu verwenden, nur JSON/XML mit einer REST - Style-Schnittstelle. 

27
John Mitchell

Um Scott Guthrie zu zitieren: In den letzten Jahren sind Web-APIs aufgestiegen - Dienste, die über einfaches HTTP und nicht über einen formaleren Servicevertrag (wie SOAP oder WS *) bereitgestellt werden.

Also würde ich nein sagen.

17
Sandman

WEB-API ist die Antwort von Microsoft auf REST -basierte APIs. Wenn Sie SOAP wünschen, gehen Sie zu WCF.

14
Paolo del Mundo

Sie sollten sich ServiceStack ansehen, mit dem derselbe Service REST + SOAP APIs unterstützt, obwohl SOAP nur über Folgendes funktioniert: HTTP POST hat einige Einschränkungen

ServiceStack-Referenz hinzufügen

Als Alternative zu SOAP bietet ServiceStack eine bessere Alternative zu WCFs Add Service Reference , mit der eine typisierte API aus einer URL mit der Funktion Add ServiceStack Reference generiert werden kann eingebaut in ServiceStackVS .

Vorteile gegenüber WCF

  • Einfach Verwendet eine kleine T4-Vorlage, um generierte POCO-Typen zu speichern. Aktualisieren so einfach wie das erneute Ausführen der T4-Vorlage
  • Vielseitige Clean-DTOs funktionieren in allen JSON-, XML-, JSV-, MsgPack- und ProtoBuf generischen Service-Clients
  • Wiederverwendbare generierte DTOs sind nicht an einen Endpunkt oder ein Format gekoppelt. Die Standardeinstellungen sind sowohl teilweise als auch virtuell, um eine maximale Wiederverwendung zu gewährleisten
  • Ausfallsichere Messaging-basierte Dienste bieten eine Reihe von Vorteilen gegenüber RPC-Diensten
  • Flexible DTO-Generierung ist anpassbar. Server und Clients können integrierte Standardeinstellungen überschreiben
  • Integrierte Rich Service-Metadaten, die auf DTOs mit Anmerkungen versehen sind, Interne Services werden beim externen Zugriff ausgeschlossen

WebAPI und WCF unterstützen beide RPC-Methodensignaturen

Interessant ist, dass WebAPI ApiController-Methoden bei der Verwendung von C # RPC-Methoden zum Erstellen und Definieren von Chatty-Webdiensten dieselben RPC-Ansatz wie WCF verwendet haben, dass dies jedoch immer noch nicht der Fall ist können ihren eigenen SOAP Standard unterstützen, der von derselben Firma erstellt wurde.

ServiceStack unterstützt REST-, SOAP-, HTML- und MQ-Endpunkte mit demselben Service

Dies ist ein Testament für ServiceStacks nachrichtenbasiertes Design , das zahlreiche Vorteile bietet, obwohl der selbe Dienst unterstützt werden kann Mehrere Endpunkte und Formate, einschließlich REST-, SOAP- und MQ-Endpunkte sowie Generieren von serverseitigen oder clientseitigen HTML-Websites falls erforderlich. Hier ist ein Beispiel für einen Rich Northwind-Datenbankeditor , der, da er mit ServiceStack erstellt wurde, automatisch typisierte REST APIs aktiviert, die mit Rich-Native-Desktop-Clients, Mobile Apps und Single Page Apps.

SOAP ist immer noch eine schlechte Option für Remotedienste

Obwohl wir SOAP aus Gründen der Interoperabilität, Zugänglichkeit und Abwärtskompatibilität unterstützen, empfehlen wir dies nicht für den Aufbau von Webservice-Plattformen, da es nicht unbedingt komplex, spröde, langsam und ausführlich ist und es viel bessere Alternativen zu gibt verwenden. Ich erkläre ausführlicher in meinem Interview auf InfoQ .

13
mythz

In der Regel unterstützt WebApi SOAP nicht. Es ist jedoch ein recht flexibles Framework, und Sie könnten es für den Umgang mit SOAP "anpassen": Nichts hindert Sie daran, die empfangenen SOAP -Nachrichten manuell zu analysieren (sie sind immerhin nur XML) und die Antworten manuell als XML-Zeichenfolgen zu generieren Senden Sie sie dann mit dem entsprechenden Content-Type-Header (Sie könnten sogar Ihren eigenen Formatierer schreiben dafür).

Je nach Ihren Bedürfnissen und Ihrer vorhandenen Codebase kann dies den Aufwand wert sein oder Sie möchten eine SOAP-fähigere Technologie wie WCF oder das bereits erwähnte ServiceStack -Framework verwenden.

6
Konamiman

Vielleicht möchten Sie ServiceStack betrachten, das SOAP und REST in einer Schnittstelle ohne Probleme unterstützen soll. Es gibt an, dass es eine bessere Übereinstimmung als WebAPI für Webdienste ist.

Ich kann nicht behaupten, alles über den Unterschied zu wissen, aber die Probleme, die sie behaupten, sind dem Web-API-Ansatz inhärent, den ich aus Erfahrung sagen kann: are real - Die API-Entwicklung (unvermeidlich in einem realen Projekt) ist im Web ziemlich kompliziert api. Und natürlich unterstützt Web-API keine SOAP.

3
Eamon Nerbonne

Es ist nicht so, dass Wed API SOAP unterstützt, aber aufgrund von SOAP handelt es sich lediglich um einen Standard, der XML verwendet, und es wird HTTP verwendet. Mit dem Web-API können Sie einen POST - Dienst zum Lesen von XML bereitstellen und finden Sie die benötigten Knoten mithilfe von XPath. Deserialisieren Sie die Knoten dann in Objekte.

Zunächst müssen Sie den ConfigureServices XML-Unterstützung hinzufügen

public void ConfigureServices(IServiceCollection services)
    {

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

Dann müssen Sie in Ihrem Controller nur eine Methode hinzufügen, die ein XMLDocument empfängt, und mit XPath nach dem Knoten suchen, den Sie interessiert (im Wesentlichen den Seifenumschlag, den Header, den Körper) und dann können Sie das Objekt deserialisieren. In meinem Fall füge ich die Servicereferenz mithilfe der WSDL hinzu und deserialisiert das Objekt.

[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));


    }

Wie Sie im nächsten Bild sehen können, verwendet der Dienst, der versucht, Ihren Dienst in Anspruch zu nehmen, eine Anforderungsmethode POST mit der Accept-Encoding-Methode: gzip. Aus diesem Grund können Sie eine Web-API bereitstellen, die für einen SOAP - Dienst verwendet werden kann  enter image description here

0
mavi