Hallo,
ich bin neu im Bereich der Webservices. Ich habe mir ein Webservice erstellt der verschiedene Methoden zur Verfügung stellt.
Der Webservice stellt unter anderem eine Methode bereit, die als Parameter ein Objekt pData erwartet. Die Klasse pData implementiert IXmlSerializable. Es funktioniert auch alles wunderbar außer folgendes. pData enthält den Wert myData vom Typ float. Wenn der Floatwert groß genug ist, dann wird er auch in exponentieller Schreibweise übertragen. Ansonsten ohne e Notation.
Wie kann ich meinen Client nun dazu bringen, den Float Wert immer in exponentieller Form zu übertragen.
Folgendes sendet der Client. Der Unterschied der beiden XML-Dateien ist die Größe des Float Wertes. Dadurch wird dieser einmal in exponentieller und einmal ohne dargestellt /übertragen.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
<AuthHeader xmlns="http://test.de">
<UserName>****</UserName>
<Password>****</Password>
</AuthHeader>
</soap:Header>
<soap:Body>
<submit_data xmlns="http://test.de">
<pd>
<Key>123-ein-456-Key</Key>
<TimeStamp>2000-01-01T00:00:00</TimeStamp>
<Code>123</Code>
<myData>12.30201</myData>
</pd>
</submit_data>
</soap:Body>
</soap:Envelope>
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Header>
<AuthHeader xmlns="http://test.de">
<UserName>****</UserName>
<Password>****</Password>
</AuthHeader>
</soap:Header>
<soap:Body>
<submit_data xmlns="http://test.de">
<pd>
<Key>123-ein-456-Key</Key>
<TimeStamp>2000-01-01T00:00:00</TimeStamp>
<Code>123</Code>
<myData>7.242001E+18</myData>
</pd>
</submit_data>
</soap:Body>
</soap:Envelope>
Vielen Dank im voraus.
Gruß
Zuerst würde ich sage, die Zahlendarstellung kann durch doch eigentlich wurscht sein, solange alles wieder richtig deserialisiert wird.
Aber IXmlSerializable ist ja gerade dafür gedacht genau steuern zu können wie serialisiert werden soll. Du musst einfach die richtige Format bei der Umwandlung in einen String angeben, die entsprechende .ToString()-Methode ist dein Freund 😉.
Die entsprechenden Formatzeichen findest du hier: Standardmäßige Zahlenformatzeichenfolge
using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}
Danke für deine Antwort.
Das Problem ist das ich Float beim Deserialisieren in einen String umwandle.
float myFloat = 1.354201f;
.
.
.
writer.WriteElementString("myFloat ", myFloat .Value.ToString("0.000000e00").Replace(',','.'));
.
.
.
In der Richtung Webservice -> Client funktioniert das auch alles wunderbar. Client -> Webservice nur wenn die Werte groß genug sind und damit verbunden eine wissenschaftliche Darstellung benötigt wird.
Muss bzw. kann ich auf Clientseite die De/Serialisierung auch beeinflussen oder übernimmt der Client das alles von Webservice Seite aus. Ich bin ja der Meinung zweiteres.
Danke
UPDATE:
Ich habe eine Lösung gefunden, ob die schön und richtig ist sei mal dahingestellt. Es funktioniert auf jedenfall. Mit Hilfe einer SoapExtension (die hatte ich schon) nach dem serialisieren den Stream verändern und dann erst abschicken.
Vielleicht interessiert es jemanden Lösung habe ich hier her:
http://forums.asp.net/p/1137408/4250286.aspx/1?Re+Adding+information+to+the+SOAP+Header