无法在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
我有试过并没有标签,但我无法得到它的工作。
答
正如您所看到的,我发送了我认为是格式良好且非常简单的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
最后我改变了我的负荷,JSON,和多数民众的工作就像一个魅力... – Maxime