Ein aktuelles Projekt wurde von „WinForm greift direkt auf DB2 zu“ auf „WinForm greift über den PHP-Webdienst auf DB2 zu“.
(Der Vorteil besteht darin, dass PHP unter Linux ausgeführt werden kann und Linux kostenlos ist)
Die Schwierigkeit dieses Vorschlags besteht nicht darin, auf DB2 zuzugreifen, sondern auf .NET, das den PHP-Webdienst aufruft. Für mich, eine Person, die schon lange mit .NET arbeitet und immer der Meinung ist, dass nur .NET Webservices ausführen kann, ist das wirklich etwas schwierig.
Aber das Problem muss noch gelöst werden und die Frist steht unmittelbar vor der Tür. Nach einiger Recherche habe ich endlich einen Hinweis bekommen, und jetzt teile ich ihn mit Ihnen.
Zunächst benötigt der PHP-Server mindestens zwei Dateien – eine WSDL-Datei und eine PHP-Datei. Die WSDL-Datei ist eine maschinenlesbare XML-Datei, die zur Beschreibung der von WebService bereitgestellten Dienste und Aufrufmethoden verwendet wird (für .NET kann der Aufrufcode automatisch generiert werden, was sehr einfach zu verwenden ist. Die PHP-Datei ist die echte). WEB-Dienst.
1) serverseitiger PHP-Code
1-1) TestWebService.php-Code
Das Folgende ist der zitierte Inhalt:
class TestWebService
{
öffentliche Funktion HelloWorld()
{
return array("HelloWorldResult"=>"Hello");
}
öffentliche Funktion GetArray( $ args) {
/*
Beachten Sie, dass die Webdienstmethode mindestens ein Parameter ist, wenn die Anweisung deklariert wird.
(Das ist sehr verwirrend. Nach meinem Verständnis fügt das System beim Aufrufen dieser Methode alle Parameter in ein Objekt ein und übergibt sie) value1 = $args->value1;
//The Der Rückgabewert ist ebenfalls etwas ganz Besonderes, anstatt $arry direkt zurückzugeben, fügen wir ihn in ein Objekt ein und geben ihn zurück.
return array("GetArrayResult"=>$arry);
}
//Eine WebSevice-Instanz erstellen
$server = new SoapServer("TestWebService.wsdl" ) ;
$server->setClass("TestWebService");
$server->handle();
1-2) TestWebService.wsdl-Code
Das Folgende ist der zitierte Inhalt:
.
< s:element minOccurs="0" maxOccurs="1" name="GetArrayResult" type="tns:ArrayOfString" />
< ;/wsdl:message>
wsdl:message>
< wsdl:service name="TestWebService">
Bei vielen Methoden ist es unmöglich, den Code manuell einzugeben. Es gibt eine clevere Möglichkeit: Verwenden Sie .NET, um einen Webdienst ohne echten Methodenkörper zu implementieren, und verwenden Sie dann http://***/TestWebService.asmx? Die WSDL-Methode generiert eine WSDL-Codedatei.
Bezüglich der WSDL-Datei möchte ich zwei besondere Punkte erläutern:
(1) Der Knoten „soap:address“ ist die Adresse, an der der WebService deklariert wird, und er muss in geändert werden entsprechende Adresse während der Bereitstellung;
(2) Der deklarierte Typ des eindimensionalen Arrays ist ArrayOfType und der deklarierte Typ des String-Arrays ist ArrayOfString. Wenn Type kein einfacher Typ ist, muss Type separat deklariert werden.
2) .NET-Client-Code
Fügen Sie zunächst eine Webreferenz hinzu. Die Adresse ist die HTTP-Adresse der WSDL-Datei.
Aufrufcode (C#)
Das Folgende ist der zitierte Inhalt: > ;
Zusammenfassung: (1) PHP ist eine schwach typisierte Sprache und es ist schwierig, sie auf Fehler zu überprüfen. Der Array-Typ unterscheidet sich auch vom allgemein verstandenen Array. Er wird auch ähnlich wie Hashtable verwendet.
(2) Die PHP-Webdienstmethode kann höchstens einen eingehenden Parameter und Rückgabewert haben, da die Parameter und der Rückgabewert beim tatsächlichen Aufruf alle in einem Objekt verpackt und übertragen werden.
(3) Der PHP-Webdienst unterstützt auch komplexe Typen wie benutzerdefinierte Typen und benutzerdefinierte Typ-Arrays, unterstützt jedoch nicht mehrere Arrays.
(4) Wenn der Rückgabewert mehrere zweidimensionale Tabellen sein muss, dachte ich oberflächlich, dass eine Reihe von String-Arrays übertragen werden können, und das Format ist