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.
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
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.
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.
Wechseln Sie zu Ihrem C # -Quellcode. Fügen Sie using WindowsFormsApplication1.ServiceReference1
Hinzu.
Service1Client service = new Service1Client();
int year = service.getCurrentYear();
Ich hoffe, dies hilft, wenn Sie auf ein Problem stoßen, lassen Sie es uns wissen.
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.):
</rant>
:)
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();
}
}
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:
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.
Sie suchen am falschen Ort. Sie sollten nachschlagen Windows Communication Framework .
WCF wird sowohl auf dem Client als auch auf dem Server verwendet.
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.