Ik gebruik een PHP SoapServer om Soap calls af te handelen in een project. De client is een in C# geschreven applicatie welke mbv een web reference/wsdl de Soap calls maakt.
Nu blijkt dat als ik een multi-line string (in windows is dat dus \r\n aan 't eind van de regel) vanuit de client naar de server stuur dat er enkel een \n (uiteindelijk) in de database terecht komt.
Ik heb toen alle \r's vervangen door #R# en alle \n's door #N# om zo te zien of de \r uberhaupt goed binnen kwam in de methode die de SoapServer aanroept. Wat blijkt? De \r is dan al verdwenen. Dus; dan zit ergens in het transport ofwel in de SoapServer. Om dat uit te sluiten heb ik het netwerk verkeer gesniffed en daaruit blijkt dat de \r\n (0x0D0A) wel degelijk in de Soap call zit naar de server toe.
De call word als volgt afgehandeld:
Daar lijkt me dus weinig aan te veranderen wat een oplossing zou (kunnen) bieden voor mijn probleem. Misschien dat in de SoapServer constructor nog een optie meegegeven kan worden die mijn probleem verhelpt, maar die zijn zover ik kan zien niet gedocumenteerd
De karige info die ik wél her-en-der vind is als volgt:
). Misschien dat ik 't over het hoofd zie, maar ik kan er niets over vinden.
Ik heb even zitten googlen om te zien of in de WSDL nog wat zaken gezet zouden kunnen worden (zoals xml:space of preserveWhiteSpace) maar ik kan daar ook weinig zinnigs over vinden; daarbij: de \r\n gaan wel degelijk naar de server in de call. Maar de functie ontvangt de parameter dus zonder \r.
Mogelijke workarounds:
Omdat ik databinding gebruik op de textboxes in mijn form heb ik geen zin om daar "speciaal voor multiline textboxes" nog eens tussen te gaan zitten om die \r er tussen te frotten en doe ik dat niet dan worden er blokjes weergegeven omdat de (normale) textboxes een \r\n verwachten en dus geen \n...
Nu blijkt dat als ik een multi-line string (in windows is dat dus \r\n aan 't eind van de regel) vanuit de client naar de server stuur dat er enkel een \n (uiteindelijk) in de database terecht komt.
Ik heb toen alle \r's vervangen door #R# en alle \n's door #N# om zo te zien of de \r uberhaupt goed binnen kwam in de methode die de SoapServer aanroept. Wat blijkt? De \r is dan al verdwenen. Dus; dan zit ergens in het transport ofwel in de SoapServer. Om dat uit te sluiten heb ik het netwerk verkeer gesniffed en daaruit blijkt dat de \r\n (0x0D0A) wel degelijk in de Soap call zit naar de server toe.
De call word als volgt afgehandeld:
PHP:
1
2
3
4
5
6
| ... //Handle SOAP request $soap = new SoapServer('http://localhost/wsdl', array('soap_version' => SOAP_1_2, 'encoding' => 'UTF-8')); $soap->setClass($class, $foo); $soap->handle(); ... |
PHP:
1
2
3
4
5
6
| //Deze functie wordt door SoapServer gecalled public function Foo($id, $mystring) { $mystring = str_replace("\r", "#R#", $mystring) $mystring = str_replace("\n", "#N#", $mystring) //Hier blijkt er enkel een #N# in $mystring te staan } |
Daar lijkt me dus weinig aan te veranderen wat een oplossing zou (kunnen) bieden voor mijn probleem. Misschien dat in de SoapServer constructor nog een optie meegegeven kan worden die mijn probleem verhelpt, maar die zijn zover ik kan zien niet gedocumenteerd
Waar die 'features' dan gedocumenteerd zijn is mij een raadsel... (Man, wat hou ik van MSDNoptions
Allow setting a default SOAP version (soap_version), internal character encoding (encoding), and actor URI (actor).
The classmap option can be used to map some WSDL types to PHP classes. This option must be an array with WSDL types as keys and names of PHP classes as values.
The typemap option is an array of type mappings. Type mapping is an array with keys type_name, type_ns (namespace URI), from_xml (callback accepting one string parameter) and to_xml (callback accepting one object parameter).
Other options are features and cache_wsdl.
Ik heb even zitten googlen om te zien of in de WSDL nog wat zaken gezet zouden kunnen worden (zoals xml:space of preserveWhiteSpace) maar ik kan daar ook weinig zinnigs over vinden; daarbij: de \r\n gaan wel degelijk naar de server in de call. Maar de functie ontvangt de parameter dus zonder \r.
Mogelijke workarounds:
- Ik weet, server-side, waar ik multiline strings kan verwachten; daar kan ik natuurlijk een replace('\n', '\r\n', $mystring) op los laten...
- Ik kan in de client, waar ik multiline texboxes gebruik, een usercontrol inheriten van een textbox control en die de replace \n -> \r\n laten uitvoeren
- Ik kan een "magic value" gebruiken i.p.v. \r\n
- Etc. etc.
[ Voor 8% gewijzigd door RobIII op 02-06-2009 15:00 . Reden: Typo in 2e code blok :X ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij