Ik heb een soapserver opgezet en er komen wat clients die er mee gaan communiceren. Deze clients zijn identiek, alleen kunnen er wat specifieke gevallen voordoen:
1) normale server - client configuratie
2) de client staat op dezelfde machine als de server
3) de server is niet bereikbaar (client offline)
In het eerste geval doe ik gewoon soap, dat werkt prima. Dat werkt ook in het tweede geval, alleen nu heb ik de mogelijkheid de functies van de server direct aan te spreken door gewoon de server te includen. In het derde geval wil ik de requests lezen en schrijven naar de schijf (als er info op aanwezig is iig)
Aangezien ik de clients identiek wil houden wil ik dus dat ie zelf uitvogelt in welke situatie hij zit. Eerste gedachten was om de __soapCall() method van de client uitbreiden. Ik dacht namelijk dat deze impliciet aangeroepen wordt, maar dat lijkt niet het geval te zijn
Wat ik wel kan doen is de __doRequest() uitbreiden. Probleem hierbij is dat de request parameter ervan de hele xml request string al is, en ik heb eigenlijk liever de functienaam en argumenten, zoals bij __soapCall het geval zou zijn. Ter beeldvorming:
nu moet ik dus de variabelen enzo uit die request gaan prutsen, is allemaal wel te doen, maar ik vraag me af of er betere ideeen zijn
verder staat de locatie van de server in de wsdl file, die kan ik er ook wel uitklussen, maar ook daar de vraag of ik die niet ergens handiger vandaan kan halen, zodat ik kan controleren of ie hetzelfde is als de server waar de client op draait
____________________
edit:
deze aanpak gaat denk ik toch niet werken. Wat ik nu doe is het volgende:
dat werkt, de parameter geeft keurig aan of er iets fout is gegaan en dus de service offline is. Als ik nu een remote functie aanroep (iets als $client->test('foo')), dan gaat in het online geval alles goed (duh), maar in het offline geval gaat het fout. Hij komt dan namelijk niet eens bij die __doRequest, aangezien de remote method "test()" lokaal niet is aangemaakt, resultaat: een error.
Hoe vang ik nu binnen die client op dat er een niet bestaande method wordt aangeroepen? Als dat namelijk het geval is wil ik een andere actie doen (lezen uit bestand)
1) normale server - client configuratie
2) de client staat op dezelfde machine als de server
3) de server is niet bereikbaar (client offline)
In het eerste geval doe ik gewoon soap, dat werkt prima. Dat werkt ook in het tweede geval, alleen nu heb ik de mogelijkheid de functies van de server direct aan te spreken door gewoon de server te includen. In het derde geval wil ik de requests lezen en schrijven naar de schijf (als er info op aanwezig is iig)
Aangezien ik de clients identiek wil houden wil ik dus dat ie zelf uitvogelt in welke situatie hij zit. Eerste gedachten was om de __soapCall() method van de client uitbreiden. Ik dacht namelijk dat deze impliciet aangeroepen wordt, maar dat lijkt niet het geval te zijn
Wat ik wel kan doen is de __doRequest() uitbreiden. Probleem hierbij is dat de request parameter ervan de hele xml request string al is, en ik heb eigenlijk liever de functienaam en argumenten, zoals bij __soapCall het geval zou zijn. Ter beeldvorming:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
| class AdaptiveSoapClient extends SoapClient { function __doRequest($request, $location, $action, $version) { if (zelfde server) { include_once($serverName); call_user_func(); } elseif (offline) { //schrijf / lees naar bestand } else { //online return parent::__doRequest($request, $location, $action, $version); } } } |
nu moet ik dus de variabelen enzo uit die request gaan prutsen, is allemaal wel te doen, maar ik vraag me af of er betere ideeen zijn
verder staat de locatie van de server in de wsdl file, die kan ik er ook wel uitklussen, maar ook daar de vraag of ik die niet ergens handiger vandaan kan halen, zodat ik kan controleren of ie hetzelfde is als de server waar de client op draait
____________________
edit:
deze aanpak gaat denk ik toch niet werken. Wat ik nu doe is het volgende:
PHP:
1
2
3
4
5
6
7
8
9
10
11
| class AdaptiveSoapClient extends SoapClient { public $online = true; function __construct($wsdl, $options=array()) { try { parent::__construct($wsdl, $options); } catch (Exception $e) { $this->online = false; } } } |
dat werkt, de parameter geeft keurig aan of er iets fout is gegaan en dus de service offline is. Als ik nu een remote functie aanroep (iets als $client->test('foo')), dan gaat in het online geval alles goed (duh), maar in het offline geval gaat het fout. Hij komt dan namelijk niet eens bij die __doRequest, aangezien de remote method "test()" lokaal niet is aangemaakt, resultaat: een error.
Hoe vang ik nu binnen die client op dat er een niet bestaande method wordt aangeroepen? Als dat namelijk het geval is wil ik een andere actie doen (lezen uit bestand)
[ Voor 19% gewijzigd door Verwijderd op 22-05-2006 14:55 ]