www.rolandk.de
- Aktuelle Themen zu .Net -
Achtung: Hier handelt es sich um meine alte Seite.
Die aktuelle ist unter folgendem Link erreichbar: www.rolandk.de/wp/
Home Blog Php-Webservices von C# aus per Xml-Rpc aufrufen




















































Php-Webservices von C# aus per Xml-Rpc aufrufen
Samstag, den 09. Juli 2011 um 14:55 Uhr

Eine einfache, aber nicht zu unterschätzende Frage: Wie lässt man ein C#-Desktop-Programm mit einem php-Script auf einem Webserver kommunizieren? Hört sich jetzt sehr ungewöhnlich an, aber genau vor dieser Fragestellung stand ich vor kurzem, weil ich einige Funktionen dieser Homepage über ein C#-Desktop-Programm aufrufen wollte. Normalerweise kommt mir bei so etwas sofort das Stichwort Webservice.. aber Soap-Webservices in php? Viel Aufwand wollte ich da nicht rein stecken, also kam mir eine andere Idee.

 

Es gibt im Internet neben den üblichen auf Soap basierenden Webservices auch welche, die den einfacheren Standard Xml-Rpc nutzen. Hierbei handelt es sich ebenfalls um Http-Aufrufe, die übertragene Xml-Struktur ist aber sehr viel einfacher aufgebaut. Ein einfacher Methoden-Aufruf sieht etwa so aus:

  1. <?xml version="1.0"?>
  2. <methodCall>
  3. <methodName>weblogUpdates.extendedPing</methodName>
  4. <params>
  5. <param>
  6. <value>www.rkoenig.eu</value>
  7. </param>
  8. <param>
  9. <value>http://www.rkoenig.eu</value>
  10. </param>
  11. <param>
  12. <value>http://www.rkoenig.eu/index.php[...]</value>
  13. </param>
  14. </params>
  15. </methodCall>

Hier erkennt man bereits aus der Xml-Struktur, dass die Methode weblogUpdates.extendedPing mit drei Parametern aufgerufen wird. Es handelt sich dabei um eine Google-Schnittstelle, mit deren Hilfe man der Suchmaschine einen neuen Blog-Eintrag melden kann. Als Antwort kommt eine ähnlich einfache Struktur wieder zurück. Sieht schon einfacher aus, als die Nachrichten, die zwischen Soap-Webservices ausgetauscht werden. Und hier komme ich wieder zum ursprünglichen Thema zurück, denn meine Idee war es schlicht, statt auf Soap auf Xml-Rpc zu setzen. Der Grund ist die einfache Integration in C# und in Php, natürlich mithilfe der entsprechenden Bibliotheken.

 

Auf der Php/Server Seite gibt es mehrere Bibliotheken. Für meine Versuche habe ich diese hier (http://phpxmlrpc.sourceforge.net) verwendet. Die Implementierung einer neuen Methode auf dem Php-Server ist damit sehr einfach, da diese ganz normal ausprogrammiert und anschließend für das Xml-Rpc-Protokoll aktiviert werden kann. Eine einfache Methode sieht etwa so aus:

  1. <?php
  2. //Include xml-rpc classes
  3. include("lib/xmlrpc.inc");
  4. include("lib/xmlrpcs.inc");
  5.  
  6. //Define xml-rpc api
  7. $simplepost_sig = array(array($xmlrpcString));
  8. $simplepost_doc = "Just returns another string to text xmlrpc communication";
  9. function simplepost($parameter)
  10. {
  11. $parameterArray = php_xmlrpc_decode($parameter);
  12. $testString = $parameterArray[0];
  13. return new xmlrpcresp(new xmlrpcval(
  14. "Method call was successfull using the given string '".$testString."'"));
  15. }
  16.  
  17. //Register server
  18. $s = new xmlrpc_server(array(
  19. "simplepost.do" => array(
  20. "function" => "simplepost",
  21. "signature" => $addcomment_sig,
  22. "docstring" => $addcomment_doc
  23. ),
  24. ));
  25. ?>

Zunächst müssen die Xml-Rpc Klassen per Include eingebunden werden, danach wird in der Funktion simplepost die Logik ausprogrammiert, und am Ende wird sie für das Xml-Protokoll aktiviert. Ist unkompliziert und kann um beliebig viele Methoden erweitert werden.

 

Für das C#-Programm habe ich die Bibliothek Xml-Rpc.Net (http://www.xml-rpc.net/) verwendet. Auch hier ist die Implementierung sehr einfach gehalten, wie nachfolgender Programmausschnitt zeigt.

  1. public class XmlRpcCaller
  2. {
  3. /// <summary>
  4. /// Perform the simplepost call
  5. /// </summary>
  6. public static void CallSimplePost()
  7. {
  8. //Call method defined in php
  9. IDummyService dummyService = XmlRpcProxyGen.Create<IDummyService>();
  10. string result = dummyService.GetStateName("Test-Call");
  11.  
  12. //Show the result
  13. MessageBox.Show(
  14. result,
  15. "XML-RPC Call",
  16. MessageBoxButtons.OK,
  17. MessageBoxIcon.Information);
  18. }
  19.  
  20. /// <summary>
  21. /// Interface defining xml-rpc communication
  22. /// </summary>
  23. [XmlRpcUrl("http://www.rkoenig.eu/xmlrpc/simplepost.php")]
  24. public interface IDummyService
  25. {
  26. /// <summary>
  27. /// Gets the name of the given state value.
  28. /// </summary>
  29. /// <param name="stateNumber">The state number.</param>
  30. [XmlRpcMethod("simplepost.do")]
  31. string GetStateName(string testString);
  32. }
  33. }

Es wird ähnlich wie von WCF gewohnt ein Interface definiert, das die Xml-Rpc-Schnittstelle abbildet. Anschließend kann über die Klasse XmlRpcProxyGen ein Proxy-Objekt generiert werden, welches die Schnittstelle implementiert und direkt den weiter oben beschriebenen php-Webservice aufruft. Am Ende wird das Ergebnis per MessageBox.Show ausgegeben. Das Ergebnis sieht dann so aus:

 

 

Die beiden Welten Php und C# können über diesen Weg also einfach verbunden werden, ich persönlich werde dieses Protokoll auch weiter verwenden. Interessant dürfte noch werden, in wieweit dieses Protokoll mit komplexeren Strukturen und/oder Tabellen umgehen kann.

 

Kommentar hinzufügen

Ihr Name:
Kommentar:

Kommentare (2)

2. Amit gupta
Dienstag, den 30. August 2016 um 10:29 Uhr
Packers and Movers Bangalore @ http://www.relocateurhome.in/packers-and-movers-bangalore.html
Packers and Movers Hyderabad @ http://www.relocateurhome.in/packers-and-movers-hyderabad.html

1. dsjaoif
Samstag, den 16. Juli 2016 um 06:47 Uhr
[url=http://www.iub.edu.pk/about_me.php]Cheap Pandora[/url]
[url=http://www.iub.edu.pk/Events.php]Wholesale Pandora charms[/url]
[url=http://www.iub.edu.pk/fashion.php]cheap Pandora Charms[/url]
[url=http://www.iub.edu.pk/help.php]Pandora Charms cheap[/url]
[url=http://www.iub.edu.pk/info.php]Pandora Jewelry[/url]
[url=http://www.iub.edu.pk/iubdns.php]Wholesale Pandora[/url]
[url=http://www.cheapjewe11erystore.com/]Cheap Pandora Store[/url]
[url=http://www.cheapjewe11erystore.com/sitemap.php]Sitemap[/url]
[url=http://www.cheapshoesfreeshipping.com/]Best Shoes news Website[/url]
[url=http://www.cheapshoesfreeshipping.com/sitemap.php]Sitemap-Shoes City SiteMap[/url]