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.
quelle
Antworten:
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).
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.
Ich verwende http://www.dneonline.com/calculator.asmx?WSDL als Beispiel
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.CalculatorServiceReference
der Name der Proxy-KlasseCalculatorSoapClient
. Wie oben erwähnt, können die Klassennamen in Ihrem Fall variieren.Gehen Sie zu Ihrem C # -Quellcode und fügen Sie Folgendes hinzu
using WindowsFormsApplication1.ServiceReference1
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.
quelle
Service1Client service = new Service1Client();
In meinem serviceReference-Namensraum gibt es nur WSDL-Klassen?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.):
</rant>
:) :)quelle
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(); } }
quelle
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.
quelle
Du suchst am falschen Ort. Sie sollten Windows Communication Framework nachschlagen .
WCF wird sowohl auf dem Client als auch auf dem Server verwendet.
quelle
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.
quelle