SOAP-Client in .NET - Referenzen oder Beispiele?

76

Hintergrund:

Ich erstelle eine Webservices-Site, die viele Arten von einfachen Diensten über SOAP und möglicherweise auch andere Protokolle bereitstellt. Das Ziel ist es, es einfach zu machen, zum Beispiel Konvertierungen, RSS-Analyse, Spam-Prüfungen und viele andere Arten von Arbeit. Die Seite richtet sich hauptsächlich an Anfänger.

Mein Problem:

Ich habe noch nie ein C # oder .NET entwickelt. Ich habe vor vielen Jahren einige VB6 gehackt, aber das war's. Jetzt brauche ich einige Beispiele für RPC-Aufrufe über SOAP in C # . Ich habe versucht, das Web und den Stapelüberlauf zu durchsuchen, um dies zu finden, aber nicht viele Ressourcen gefunden, und ich habe keine Ahnung, wie die Ressourcen eingestuft werden sollen (welche sind alt? Welche sind falsch? Usw.).

Ich habe einen einfachen Beispieldienst erstellt, der in PHP so heißt:

<?php
$client = new SoapClient('http://webservi.se/year'); //URL to the WSDL
echo $client->getCurrentYear(); //This method returns an integer, called "year"
?>

Ich möchte diese Methode jetzt so einfach wie möglich in C # aufrufen. Alle Referenzen und Beispiele sind sehr willkommen. Wo soll ich anfangen? Welche Klassen / Module / was kann ich verwenden?

Die Lösung muss SOAP überhaupt nicht beinhalten, wenn es bessere Kommunikations-Frameworks gibt (das Back-End soll erweiterbar sein). Beachten Sie jedoch, dass die Serverseite in PHP unter Unix implementiert ist, sodass proprietäre Lösungen von Microsoft nicht in Frage kommen die Serverseite.

Beachten Sie, dass ich dies benötige, damit ich eine Dokumentation schreiben kann, der J. Random Web Developer folgen kann (auch wenn sie sich auf einem gemeinsam genutzten Webhosting befinden). Ich denke daher, dass der beste Ansatz darin bestehen sollte, dies nur im Code zu tun, aber auch andere Möglichkeiten, dies zu tun, sind natürlich willkommen.

Emil Vikström
quelle
Hält Sie etwas davon ab, einen Dienstverweis auf die URL der WSDL in Ihrem Projekt zu erstellen?
Frédéric Hamidi
1
Frédéric, mein Hauptproblem ist, dass ich keine Ahnung habe, wie ASP.NET damit umgeht. Was ist eine "Servicereferenz"? Ist es möglich, nur Code zu verwenden, oder muss ich auf irgendeine Weise zeigen und klicken? Beachten Sie, dass ich dies benötige, damit ich eine Dokumentation schreiben kann, der J. Random Web Developer folgen kann (auch wenn sie sich auf einem gemeinsam genutzten Webhosting befinden).
Emil Vikström
@Emil, es ist ein Zeigen und Klicken erforderlich, um den C # -Code für die im WSDL-Dokument beschriebenen Klassen zu generieren. Danach ist nicht mehr viel Code erforderlich, wenn sich die URL des Dienstes nie ändert. Siehe diesen Artikel über MSDN .
Frédéric Hamidi

Antworten:

153

Voraussetzungen : Sie haben bereits den Dienst und die veröffentlichte WSDL-Datei und möchten Ihren Webdienst über die C # -Clientanwendung aufrufen.

Es gibt zwei Möglichkeiten, dies zu tun:

A) ASP.NET-Dienste , die eine alte Methode zur Durchführung von SOA sind.
B) WCF , wie John vorgeschlagen hat. Dies ist das neueste Framework von MS und bietet viele Protokolle, einschließlich offener und MS-eigener Protokolle.

Schrittweises Hinzufügen einer Servicereferenz

Am einfachsten ist es, Proxy-Klassen in einer C # -Anwendung zu generieren (dieser Vorgang wird als Hinzufügen einer Dienstreferenz bezeichnet).

  1. Öffnen Sie Ihr Projekt (oder erstellen Sie ein neues) in Visual Studio
  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt (auf das Projekt und nicht auf die Lösung) und klicken Sie auf Dienstreferenz hinzufügen
  3. Im folgenden Screenshot sollte ein Dialogfeld angezeigt werden. Geben Sie die URL Ihrer WSDL-Datei ein und klicken Sie auf OK. Beachten Sie, dass Sie, wenn Sie nach dem Klicken auf OK eine Fehlermeldung erhalten, versuchen, den? Wsdl-Teil aus der URL zu entfernen.

    Service-Referenzdialog hinzufügen

    Ich verwende http://www.dneonline.com/calculator.asmx?WSDL als Beispiel

  4. Erweitern Sie Dienstreferenzen im Projektmappen-Explorer und doppelklicken Sie CalculatorServiceReference(oder wie auch immer Sie den Dienst im vorherigen Schritt benannt haben).

    Sie sollten den Namen und den Namespace der generierten Proxy-Klasse sehen.

    In meinem Fall ist der Namespace SoapClient.CalculatorServiceReferenceder Name der Proxy-Klasse CalculatorSoapClient. Wie oben erwähnt, können die Klassennamen in Ihrem Fall variieren.

    Service-Referenz-Proxy-Calss

  5. Gehen Sie zu Ihrem C # -Quellcode und fügen Sie Folgendes hinzu

    using WindowsFormsApplication1.ServiceReference1
    
  6. Jetzt können Sie den Dienst auf diese Weise aufrufen.

    Service1Client service = new Service1Client();
    int year = service.getCurrentYear();
    

Hoffe das hilft. Wenn Sie auf Probleme stoßen, lassen Sie es uns wissen.

Davita
quelle
4
Danke für deine Antwort. Ich schätze die Screenshots und die theoretische Beschreibung sehr. Auch wenn die Theorie einfach sein mag, ist sie für mich immer noch eine neue Umgebung. Ich werde das ausprobieren.
Emil Vikström
7
Kein Problem :) Vertrau mir, es ist auch in der Praxis einfach. und wenn Sie ein Problem haben, ist SO dafür da, sich gegenseitig zu helfen, oder? :-)
Davita
Emil, es könnte Sie interessieren, dass das Programm wsdl.exe unter den oben angezeigten GUI-Bildschirmen das schwere Heben übernimmt. Sie können dies selbst über die Befehlszeile ausführen und den für Sie generierten Code anzeigen.
Mtutty
1
Wie unten von einem anderen Kommentator erwähnt, repräsentiert in C # Windows Communication Foundation (wcf) sowohl die Technologie für Hosting-Dienste als auch für Anrufdienste. Das Obige zeigt Ihnen, wie Sie automatisch WCF-Proxys in Visual Studio erstellen. Dies ist eine von vielen Möglichkeiten, einschließlich der Erstellung von Proxys mit wsdl.exe, wie von mtutty angegeben.
TRayburn
1
Ich kann anscheinend nicht finden Service1Client service = new Service1Client();In meinem serviceReference-Namensraum gibt es nur WSDL-Klassen?
Zapnologica
25

Ich habe ziemlich viel getan, wovon Sie sprechen, und die SOAP-Interoperabilität zwischen Plattformen hat eine Grundregel: VERTRAG ZUERST. Sie nicht leiten Sie Ihre WSDL von Code und dann versuchen , einen Client auf einer anderen Plattform zu generieren. Alles andere als Funktionen vom Typ "Hello World" wird höchstwahrscheinlich keinen Code generieren, zur Laufzeit nicht sprechen oder (mein Favorit) nicht alle Daten ordnungsgemäß senden oder empfangen, ohne einen Fehler auszulösen.

Das heißt, WSDL ist kompliziertes, böses Zeug und ich vermeide es, es von Grund auf neu zu schreiben, wann immer es möglich ist. Hier sind einige Richtlinien für eine zuverlässige Interop von Diensten (unter Verwendung von Webreferenzen, WCF, Axis2 / Java, WS02, Ruby, Python usw.):

  • Führen Sie Code-First aus, um Ihre erste WSDL zu erstellen. Löschen Sie dann Ihren Code und generieren Sie die Serverklasse (n) aus der WSDL neu. Fast jede Plattform hat dafür ein Werkzeug. Dies zeigt Ihnen, welche seltsamen Gewohnheiten Ihre spezielle Plattform hat, und Sie können damit beginnen, die WSDL so zu optimieren, dass sie einfacher und unkomplizierter ist. Optimieren, neu generieren, wiederholen. Auf diese Weise lernen Sie viel und es ist tragbares Wissen.
  • Halten Sie sich bei komplexen Typen an einfache alte Sprachkurse (POCO, POJO usw.). Verwenden Sie KEINE plattformspezifischen Konstrukte wie List <> oder DataTable. Sogar assoziative PHP-Arrays scheinen zu funktionieren, schlagen jedoch auf eine Weise fehl, die plattformübergreifend nur schwer zu debuggen ist.
  • Halten Sie sich an grundlegende Datentypen: Bool, Int, Float, String, Datum (Uhrzeit) und Arrays. Je genauer Sie sich über einen Datentyp informieren, desto weniger agil werden Sie wahrscheinlich im Laufe der Zeit auf neue Anforderungen reagieren. Sie möchten Ihre WSDL NICHT ändern, wenn Sie dies vermeiden können.
  • Eine Ausnahme zu den oben genannten Datentypen: Geben Sie sich einen NameValuePair-Mechanismus. Sie würden nicht glauben, wie oft eine Liste dieser Dinge Ihren Speck in Bezug auf Flexibilität spart.
  • Legen Sie einen echten Namespace für Ihre WSDL fest. Es ist nicht schwer, aber Sie glauben vielleicht nicht, wie viele Webdienste ich im Namespace "http://www.tempuri.org" gesehen habe. Verwenden Sie außerdem eine URN ("urn: com-myweb-servicename-v1"), keinen URL-basierten Namespace ("http://servicename.myweb.com/v1"). Es handelt sich nicht um eine Website, sondern um einen abstrakten Zeichensatz Das definiert eine logische Gruppierung. Ich habe wahrscheinlich ein Dutzend Leute, die mich um Unterstützung bitten und sagen, dass sie auf die "Website" gegangen sind und es nicht funktioniert hat.

</rant> :) :)

mtutty
quelle
1
Gutes Zeug! Es ist nicht das, wonach ich gefragt habe, aber Sie haben immer noch viele Fragen beantwortet, die ich über mich selbst gedacht habe. "Vertrag zuerst" scheint auch in meiner Situation hier der Schlüssel zu sein.
Emil Vikström
7

Wenn Sie es in einem Browser ausführen können, funktioniert etwas so Einfaches wie dieses

var webRequest = WebRequest.Create(@"http://webservi.se/year/getCurrentYear");

using (var response = webRequest.GetResponse())
{
    using (var rd = new StreamReader(response.GetResponseStream()))
    {
        var soapResult = rd.ReadToEnd();
    }
}
Rob Allen
quelle
7

Schauen Sie sich " Verwenden von WCF-Diensten mit PHP " an. Es erklärt die Grundlagen dessen, was Sie brauchen.

Als theoretische Zusammenfassung:

WCF oder Windows Communication Foundation ist eine Technologie, mit der Dienste definiert werden können, die von der Art und Weise, wie sie aufgerufen werden, abstrahiert werden.

Die Idee ist, dass Sie einen Vertrag darüber definieren, was der Dienst tut und was der Dienst bietet, und einen anderen Vertrag darüber definieren, welche Kommunikationsmethode verwendet wird, um den Dienst tatsächlich zu nutzen, sei es TCP, HTTP oder SOAP.

Sie haben den ersten Teil des Artikels hier , zu erklären , wie einen sehr einfachen WCF - Dienst erstellen.

Mehr Ressourcen:

Verwenden von WCF mit PHP5 .

Schauen Sie sich auch NuSOAP an. Wenn Sie jetzt NuSphere verwenden, ist dies ein Toolkit, mit dem Sie eine Verbindung von PHP zu einem WCF-Dienst herstellen können.

Jorge Córdoba
quelle
Vielen Dank. Ich programmiere bereits in PHP, daher kenne ich NuSOAP sehr gut. Ich benötige Client-Code für C #.
Emil Vikström
6

Du suchst am falschen Ort. Sie sollten Windows Communication Framework nachschlagen .


WCF wird sowohl auf dem Client als auch auf dem Server verwendet.

John Saunders
quelle
Danke, ich werde das überprüfen. Vielleicht gibt es dort einige Tipps, auch wenn ich es nicht auf dem Server ausführe.
Emil Vikström
5

Hier finden Sie ein nettes Tutorial zum Aufrufen eines NuSOAP-basierten Webdienstes aus einer .NET-Clientanwendung. IMO sollten Sie jedoch auch das WSO2 Web Services Framework für PHP (WSO2 WSF / PHP) für die Wartung in Betracht ziehen . Siehe WSO2 Web Services Framework für PHP 2.0 Verbessert die branchenweit einzige PHP-Bibliothek zum Erstellen von SOAP- und REST-Diensten erheblich . Es gibt auch ein Webminar darüber.

In der .NET-Welt empfehle ich jetzt auch die Verwendung von WCF unter Berücksichtigung der Interoperabilitätsprobleme. Ein Beispiel für die Interoperabilität finden Sie hier . In diesem Beispiel wird jedoch ein PHP-Client + WCF-Dienst anstelle des Gegenteils verwendet. Fühlen Sie sich frei, den PHP-Service & WFC-Client zu implementieren.

Es gibt einige Open-Source-Projekte von WCF auf codeplex.com, die ich sehr produktiv fand. Diese Projekte sind sehr nützlich zum Entwerfen und Implementieren von Win Forms- und Windows Presentation Foundation-Anwendungen: Smart Client , Web Client und Mobile Client . Sie können in Kombination mit WCF verwendet werden, um jede Art von Webdiensten mit Bedacht aufzurufen.

Im Allgemeinen fasst das Patterns & Practices-Team bewährte Praktiken und Designs in verschiedenen Open Source-Projekten zusammen, die sich mit der .NET-Plattform speziell für das Web befassen. Daher denke ich, dass dies ein guter Ausgangspunkt für jede Entwurfsentscheidung in Bezug auf .NET-Clients ist.

Eduardo Lago Aguilar
quelle