2017-02-01 3 views
0

Ich versuche, von einem VBA für Excel-Programm eine RESTful-API in VB.NET abzufragen.XML kann in VB.NET nicht deserialisiert werden

Allerdings kann ich nicht scheinen, das XML richtig zu deserialisieren.

Auf der VBA Seite ist der Code wie folgt vor:

Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP") 
URL = "http://localhost:50261/api/values" 
objHTTP.Open "POST", URL, False 
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.0)" 
objHTTP.setRequestHeader "Content-type", "application/xml" 
objHTTP.send ("<?xml version=""1.0"" encoding=""UTF-8""?><KPISheet><site>mysite</site><unit>myunit</unit></KPISheet>)") 

Wie Sie sehen können, ich sende, was ich glaube, ein gut geformt und sehr einfache XML-Dokument ist.

Auf VB.NET Seite habe ich eine Klasse, genannt KPISheet:

Public Class KPISheet 
    Public Site As String 
    Public Unit As String 
End Class 

Und ein WebAPI, die 'POST' zu bekommen:

Public Sub PostValue(<FromBody> oKPISheet As KPISheet) 
    Debug.Print("toto") 
End Sub 

Wenn ich in der einen Haltepunkt gesetzt Debug-Zeile, ich kann sehen, dass oKPISheet Nothing ist, die XML-Datei wird nicht deserialisiert.

im Ausgabefenster, erhalte ich die folgende Fehlermeldung:

Ausnahme geworfen: 'System.Runtime.Serialization.SerializationException' in System.Runtime.Serialization.dll

ich versucht haben, und ohne das Etikett, aber ich kann es nicht zur Arbeit bringen.

+0

ich landete geändert JSON meine Last, und das ist wie ein Zauber funktionieren ... – Maxime

Antwort

1

Wie Sie sehen können, sende ich, was ich glaube, ein gut gebildetes und sehr einfaches XML-Dokument.

Leider Ihre Annahme ist falsch:

<KPISheet>site>mysite</site> 

, die ungültige XML ist. Ihnen fehlt eine Öffnung < für das Site-Tag. Sie haben anscheinend auch eine abschließende ) als letztes Zeichen in Ihrem XML.

So können Sie gültigen XML versuchen zu senden:

objHTTP.send("<?xml version=""1.0"" encoding=""UTF-8""?><KPISheet><site>mysite</site><unit>myunit</unit></KPISheet>") 

Beachten Sie auch, dass der richtige Inhaltstyp text/xml und nicht application/xml sein soll:

objHTTP.setRequestHeader "Content-type", "text/xml" 

Auch bedenken, dass XML Groß- und Kleinschreibung, Daher sollten Sie Ihre Tag-Namen groß schreiben, damit sie mit Ihren Eigenschaftsnamen übereinstimmen:

und last but not least, Web-API nutzt die Datacontract Serializer standardmäßig für die Arbeit mit XML, so müssen Sie Namespaces sind:

objHTTP.send("<?xml version=""1.0"" encoding=""UTF-8""?><KPISheet xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.datacontract.org/2004/07/WebApplication1.ViewModels.KPISheet""><Site>mysite</Site><Unit>myunit</Unit></KPISheet>") 

Vergessen Sie nicht, den Namensraum passen Sie Ihre KPISheet Klasse anzupassen.

Alternativ, wenn Sie nicht wollen, Namespaces enthalten könnten Sie die XML-Serializer Schalter verwendet:

config.Formatters.XmlFormatter.UseXmlSerializer = true; 

Und wenn Sie den Datenvertrag Serializer behalten möchten verwendet, könnte Sie die Ansicht Modell mit dem entsprechenden dekorieren Attribute:

<DataContract(Namespace="")> 
Public Class KPISheet 
    <DataMember> 
    Public Site As String 
    <DataMember> 
    Public Unit As String 
End Class 
+0

, es ist nur ein Problem mit dem kopieren/Einfügen :( der VBA-Code ist in Ordnung – Maxime

+0

Meine AKTUALISIER Leider über den Header des Inhaltstyps. –

+0

Ich habe das versucht, ohne Wirkung. Vielen Dank für Ihre Hilfe. – Maxime

Verwandte Themen