2017-02-01 8 views
0

Я пытаюсь из программы VBA для Excel запросить RESTful API в VB.NET.Не удается получить deserialize XML в VB.NET

Однако я не могу десериализовать XML должным образом.

На стороне VBA, код выглядит следующим образом:

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>)") 

Как вы можете видеть, я посылаю, что я считаю, это хорошо сформированы и очень простой XML-документ.

На VB.NET стороне, у меня есть класс, называемый KPISheet:

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

И WebAPI, чтобы получить 'POST':

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

Если я установить точку останова в Отладочная строка, я вижу, что oKPISheet is Nothing, XML-файл не десериализуется.

В окне Output, я получаю следующее сообщение об ошибке:

Exception брошенного: 'System.Runtime.Serialization.SerializationException' в System.Runtime.Serialization.dll

Я попытался с и без тега, но я не могу заставить его работать.

+0

Я в конечном итоге изменил мою нагрузку JSON, и то работать как шарм ... – Maxime

ответ

1

Как вы можете видеть, я отправляю то, что, как я считаю, является хорошо сформированным и очень простым XML-документом.

К сожалению, ваше предположение неверно:

<KPISheet>site>mysite</site> 

Это недопустимый XML. Вам не хватает открытия < для тега сайта. Кажется, у вас также есть закрытие ) в качестве последнего символа в вашем XML.

Таким образом, вы можете попробовать отправить действительный XML:

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

Также обратите внимание, что правильный тип должен быть text/xml и не application/xml:

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

иметь также в виду, что XML чувствителен к регистру, поэтому вы должны использовать ваши имена тегов в своих именах:

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

и последнее, но не в последнюю очередь, Web API использует DataContract сериалайзера по умолчанию для работы с XML, поэтому вам необходимо включить пространство имен:

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>") 

Не забудьте настроить пространство имен, чтобы соответствовать вашему KPISheet класса.

В качестве альтернативы, если вы не хотите включать в себя пространство имен можно переключить XML сериалайзер используется:

config.Formatters.XmlFormatter.UseXmlSerializer = true; 

И если вы хотите продолжать использовать контрактную данные сериалайзер вы можете украсить вашу модель представления с соответствующими атрибуты:

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

к сожалению, это просто проблема с копировать/вставить :( код VBA в порядке – Maxime

+0

Смотрите мой UPDA о заголовке типа содержимого. –

+0

Я пробовал это, без эффекта. Спасибо за вашу помощь. – Maxime