无法在VB.NET中反序列化XML

问题描述:

我尝试从VBA for Excel程序查询VB.NET中的RESTful API。无法在VB.NET中反序列化XML

但是,我似乎无法正确反序列化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是Nothing,XML文件没有反序列化。

在输出窗口,我得到了以下错误消息:

抛出异常: 'System.Runtime.Serialization.SerializationException' 在System.Runtime.Serialization.dll

我有试过并没有标签,但我无法得到它的工作。

+0

最后我改变了我的负荷,JSON,和多数民众的工作就像一个魅力... – Maxime

正如您所看到的,我发送了我认为是格式良好且非常简单的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