wake-up-neo.com

SOAP client in .NET - Referenzen oder Beispiele?

Hintergrund:

Ich erstelle eine Webservices-Site, die viele Arten von einfachen Diensten über SOAP und möglicherweise auch andere Protokolle bereitstellt. Ziel ist es, die Durchführung von Konvertierungen, RSS-Parsing, Spam-Prüfungen und viele andere Arten von Arbeiten Die Website richtet sich hauptsächlich an Anfänger-Entwickler.

Mein Problem:

Ich habe nie C # oder .NET für diese Angelegenheit 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 zu durchsuchen und Stack Overflow, um dies zu finden, aber nicht gefunden viele Ressourcen, und ich habe keine Ahnung, wie man die Ressourcen einordnet (welche sind alt, welche sind falsch usw.).

Ich habe einen einfachen Beispielservice 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 keinesfalls SOAP) beinhalten, wenn es bessere Kommunikations-Frameworks gibt (das Back-End soll erweiterbar sein), aber beachten Sie, dass die Serverseite in PHP unter Unix, so dass proprietäre Lösungen von Microsoft auf der Serverseite nicht in Frage kommen.

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

68
Emil Vikström

Soweit ich weiß, möchten Sie Ihren Webdienst von einer C # -Client-Anwendung aus aufrufen. Sie haben bereits den Service und die veröffentlichte WSDL-Datei (korrigieren Sie mich, wenn ich falsch liege). Am einfachsten ist es nun, Proxy-Klassen in einer C # -Anwendung zu generieren (dieser Vorgang wird als Hinzufügen einer Dienstreferenz bezeichnet). Hierfür gibt es zwei Hauptmethoden: .NET stellt ASP.NET-Dienste bereit, eine alte SOA-Methode, und WCF, wie von John vorgeschlagen, das neueste Framework von MS, das viele Protokolle bereitstellt, einschließlich offener und MS-proprietärer Protokolle.

Jetzt reicht die Theorie und lasst es uns Schritt für Schritt tun

  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 Projektmappe) und klicken Sie auf Dienstreferenz hinzufügen
  3. Ein Dialogfeld sollte in der Abbildung unten angezeigt werden. Geben Sie die URL Ihrer WSDL-Datei ein und klicken Sie auf OK. Beachten Sie, dass Sie versuchen, das? Wsdl-Teil aus der URL zu entfernen, wenn nach dem Klicken auf "OK" eine Fehlermeldung angezeigt wird. screen

  4. Erweitern Sie Service-Referenzen im Projektmappen-Explorer und doppelklicken Sie auf ServiceReference1 (Name kann variieren). Sie sollten den Namen und den Namespace der generierten Proxy-Klasse sehen. In meinem Fall ist der Namespace WindowsFormsApplication1.ServiceReference1, der Name der Proxyklasse ist Service1Client. Wie ich oben sagte, können die Klassennamen in Ihrem Fall variieren. enter image description here

  5. Wechseln Sie zu Ihrem C # -Quellcode. Fügen Sie using WindowsFormsApplication1.ServiceReference1 Hinzu.

  6. Jetzt können Sie den Service auf diese Weise aufrufen.

Service1Client service = new Service1Client();

int year = service.getCurrentYear();

Ich hoffe, dies hilft, wenn Sie auf ein Problem stoßen, lassen Sie es uns wissen.

136
Davita

Ich habe einiges getan, worüber Sie sprechen, und SOAP Interoperabilität zwischen Plattformen hat eine zentrale Regel: ZUERST VERTRAGEN. Führen Sie nicht Ihre WSDL aus Code ab und versuchen Sie dann, einen Client auf einer anderen Plattform zu generieren.Alle Funktionen vom Typ "Hello World" generieren mit hoher Wahrscheinlichkeit keinen Code, können zur Laufzeit nicht sprechen oder (mein Favorit) senden oder empfangen nicht alle Daten ordnungsgemäß, ohne einen Fehler auslösen.

Das heißt, WSDL ist kompliziert, böse Sachen und ich vermeide es, es von Grund auf neu zu schreiben, wann immer es möglich ist. Hier einige Richtlinien für eine zuverlässige Interop-Funktion 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 anschließend Ihren Code und generieren Sie die Serverklasse (n) aus der WSDL neu. Fast jede Plattform hat ein Tool dafür. Dies zeigt Ihnen, welche ungewöhnlichen Gewohnheiten Ihre Plattform hat, und Sie können damit beginnen, die WSDL einfacher und unkomplizierter zu gestalten. Optimieren, neu generieren, wiederholen. Sie werden auf diese Weise viel lernen und es ist portables Wissen.
  • Halten Sie sich an einfache alte Sprachklassen (POCO, POJO usw.) für komplexe Typen. Verwenden Sie KEINE plattformspezifischen Konstrukte wie List <> oder DataTable. Sogar PHP assoziative Arrays scheinen zu funktionieren, scheitern jedoch in einer Weise, die sich schwer auf verschiedenen Plattformen debuggen lässt.
  • Halten Sie sich an die grundlegenden Datentypen: Bool, Int, Float, String, Datum (Uhrzeit) und Arrays. Je genauer Sie über einen Datentyp informiert sind, desto weniger flexibel werden Sie 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 rettet.
  • Legen Sie einen echten Namespace für Ihre WSDL fest. Es ist nicht schwer, aber Sie werden vielleicht nicht glauben, 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 stellt eine logische Gruppierung dar. Ich hatte wahrscheinlich ein Dutzend Leute, die mich anriefen und sagten, sie seien auf die "Website" gegangen und es hat nicht funktioniert.

</rant> :)

24
mtutty

Wenn Sie es in einem Browser zum Laufen bringen können, dann funktioniert etwas so Einfaches wie dies

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();
    }
}
7
Rob Allen

Schauen Sie sich " mit WCF Services 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 - der zugrunde liegenden Kommunikationsmethode - abstrahiert sind, in der sie aufgerufen werden.

Die Idee ist, dass Sie einen Vertrag darüber definieren, was der Dienst tut und was er anbietet, und einen weiteren 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 , in dem erklärt wird, wie ein sehr grundlegender WCF-Dienst erstellt wird.

Mehr Ressourcen:

Verwenden von WCF mit PHP5 .

Schauen Sie auch bei NuSOAP vorbei. Wenn Sie jetzt NuSphere Dies ist ein Toolkit, mit dem Sie eine Verbindung von PHP zu einem WCF-Dienst herstellen können.

7
Jorge Córdoba

Sie suchen am falschen Ort. Sie sollten nachschlagen Windows Communication Framework .


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

6
John Saunders

Hier Hier finden Sie ein nützliches Tutorial zum Aufrufen eines NuSOAP-basierten Webdienstes aus einer .NET-Client-Anwendung. Aber IMO, Sie sollten auch das WSO2 Web Services Framework für PHP (WSO2 WSF/PHP) für die Wartung berücksichtigen. Siehe WSO2 Web Services Framework für = PHP 2.0 verbessert die branchenweit einzige PHP= Bibliothek für die Erstellung von beiden SOAP und REST= Services . 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 Interoperabilitätsbeispiel kann gefunden werden hier , aber dieses Beispiel verwendet einen PHP-Client + WCF-Dienst anstelle des Gegenteils. 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 als sehr produktiv empfand. Diese Projekte sind sehr nützlich, um Win Forms- und Windows Presentation Foundation-Anwendungen zu entwerfen und zu implementieren: Smart Client , Web Client und Mobile Client . Sie können in Kombination mit WCF verwendet werden, um alle Arten von Webdiensten sinnvoll aufzurufen.

Im Allgemeinen fasst das Patterns & Practices-Team Good Practices & 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 im Zusammenhang mit .NET-Clients ist.