[VB.NET] webservice onbekende tags

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Ik heb een VB.NET Webservice, waarmee klanten informatie kunnen toevoegen of opvragen.
Nu sturen klanten ook soms nog willekeurige andere tags mee, die ik graag zou opslaan. Ik weet deze tags echter niet van tevoren (ze mogen eventueel wel in een aparte sectie in de xml, maar liever ook niet).

ik heb dus een webservice die normaal gesproken de volgende XML-slikt (in een soapenvelop):
XML:
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <UpdateMyService xmlns="https://www.domein.nl/webservicemap/">
         <Info>
                  <A>12</A>
                  <B>34</B>
         </Info>
  </UpdateMyService>
  </soap:Body>
</soap:Envelope>


de webservice functie en klasse:
Visual Basic .NET:
1
2
3
4
5
6
7
8
Public Class InfoClass
    Dim A As String
    Dim B As String
End Class

<WebMethod(Description:="Update My Service")> _
Public Function UpdateMyService(ByVal Info As InfoClass) As UpdateResult
End Function


dit werkt op zich prima....
probleem is nu dat ik wil dat als de klant het volgende stuurt:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <UpdateMyService xmlns="https://www.domein.nl/webservicemap/">
         <Info>
                  <A>12</A>
                  <B>34</B>
                  <KlantSpecifiekeVariable>56</KlantSpeciekeVariable>
         </Info>
         <NogEenKlantSpecifiekeVariable>56</NogEenKlantSpecifiekeVariable>
 </UpdateMyService>
  </soap:Body>
</soap:Envelope>


ik de KlantSpecifiekeVariable en/of NogEenKlantSpecifiekeVariable ook beschikbaar heb in de functie UpdateMyService... ik krijg dat echter niet voor elkaar...

is uberhaupt mogelijk wat ik wil? iemand een idee hoe?

Acties:
  • 0 Henk 'm!

  • AtleX
  • Registratie: Maart 2003
  • Niet online

AtleX

Tyrannosaurus Lex 🦖

Breid InfoClass uit met een Dictionary<String, String> C? Dan kan een klant daarin extra waardes meesturen als 'ie daar zin in heeft. :)

Sole survivor of the Chicxulub asteroid impact.


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
AtleX schreef op woensdag 28 november 2012 @ 16:20:
Breid InfoClass uit met een Dictionary<String, String> C? Dan kan een klant daarin extra waardes meesturen als 'ie daar zin in heeft. :)
thanks... het was even speuren naar een goed voorbeeld, omdat een dictionary standaard niet geserialiseerd kan worden... de voorbeelden die ik online vond deden allemaal op één of andere fiets niet wat ik wilde (gingen bijvoorbeeld uit van vaste tagnames e.d.)...

heb het nu voor elkaar met onderstaande code... volgens mij niet perfect, maar het voldoet iig aan wat ik wil hebben:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Xml.Serialization

<XmlRoot("dictionary")> _
Public Class SerializableDictionary(Of TValue)
    Inherits Dictionary(Of String, String)
    Implements IXmlSerializable

    Public Function GetSchema() As System.Xml.Schema.XmlSchema Implements IXmlSerializable.GetSchema
        Return Nothing
    End Function

    Public Sub ReadXml(ByVal reader As System.Xml.XmlReader) Implements IXmlSerializable.ReadXml
        ' Dim keySerializer As New XmlSerializer(GetType(TKey))
        Dim valueSerializer As New XmlSerializer(GetType(TValue))
        Dim wasEmpty As Boolean = reader.IsEmptyElement
        reader.Read()

        If wasEmpty Then
            Return
        End If

        While reader.NodeType <> System.Xml.XmlNodeType.EndElement
            While reader.NodeType = Xml.XmlNodeType.Whitespace
                reader.MoveToContent()
            End While
            Dim key As String = reader.Name
            Dim value As String = ""

            If (Not key Is Nothing And key <> "") Then
                value = reader.ReadString
            Else
                Continue While
            End If

            reader.ReadEndElement()

            Me.Add(key, value)

            reader.MoveToContent()
        End While
        reader.ReadEndElement()
    End Sub

    Public Sub WriteXml(ByVal writer As System.Xml.XmlWriter) Implements IXmlSerializable.WriteXml
        Dim valueSerializer As New XmlSerializer(GetType(tvalue))

        For Each key As String In Me.Keys
            writer.WriteStartElement(key)
            Dim value As String = Me(key)

            valueSerializer.Serialize(writer, value)
            writer.WriteEndElement()
        Next
    End Sub
End Class


mocht iemand nog tips hebben voor verbetering, dan zijn die natuurlijk altijd welkom... leer ik weer wat van :)... maar voor nu ben ik tevreden met het resultaat...

thanks...

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 07-07 14:42
Is het niet eenvoudiger om ISerializable te implementeren... msdn.

Je kunt dan bij het terugserializen, alles wat niet naar een property mapped, zelf in een dictionary stoppen. Dan hoef je geen rare fratsen uit te halen met het zelf serializen van een dict, deze serialize je namelijk gewoon niet.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Kun je niet gewoon IExtensibleDataObject implementeren?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 07-07 14:42
Woy schreef op donderdag 29 november 2012 @ 13:39:
Kun je niet gewoon IExtensibleDataObject implementeren?
Werkt dat ook met non-wcf webservices dan? Kan er eigenlijk niks over vinden.. het word wel telkens met de DataContractSerializer genoemd, maar of het dan ook specifiek daar aan gebonden is..
Pagina: 1