2017-02-01 2 views
0

VB.NET에서 RESTful API를 쿼리하기 위해 Excel 용 VBA 프로그램에서 시도하고 있습니다.VB.NET에서 XML을 deserialize 할 수 없습니다.

그러나 XML을 올바르게 deserialize 할 수 없습니다. VBA를 측면에서

는 코드는 다음과 같은 : 당신이 볼 수 있듯이, 내가 잘 형성과 매우 간단한 XML 문서입니다 무엇을 믿는 보내고

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

. 나는에 중단 점을 설정하면

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

:

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

그리고 WebAPI의 'POST'를 얻을 :

VB.NET 측면에서

, 나는 KPISheet라는 클래스가있다 디버그 라인, oKPISheet가 Nothing이라는 것을 알 수 있습니다. XML 파일은 deserialize되지 않습니다. 던져

예외 : 출력 창에서

, 나는 다음과 같은 오류 메시지가 'System.Runtime.Serialization.SerializationException'을 System.Runtime.Serialization.dll에 내가 함께 시도

태그가 없으면 작동시킬 수 없습니다.

+0

내가, 결국 JSON에 내 부하를 변경하고 그게 전부가 마법처럼 작동 ... – Maxime

답변

1

여기서 알 수 있듯이 나는 잘 형성되고 매우 간단한 XML 문서라고 생각하는 것을 보내고 있습니다.

불행하게도 당신의 가정은 잘못된 것입니다 : 유효하지 않은 XML을의

<KPISheet>site>mysite</site> 

. 사이트 태그에 대해 < 개구부가 누락되었습니다. 또한 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>") 

그리고 마지막으로, 웹 API는 XML 작업을위한 기본적으로 datacontract 시리얼 라이저를 사용, 그래서 당신은 네임 스페이스를 포함해야합니다

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 클래스와 일치하는 네임 스페이스를 조정하는 것을 잊지 마십시오.

config.Formatters.XmlFormatter.UseXmlSerializer = true; 

을 그리고 당신은 데이터 계약 serializer를 계속 사용하려는 경우에는 해당하여보기 모델을 장식 할 수 : 당신이 XML 시리얼을 전환 할 수있는 네임 스페이스를 포함하지 않는 경우 또는

사용중인 속성 :

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

불행하게도, 그것은 복사/붙여 넣기와 단지 문제입니다 :( VBA 코드는 괜찮아 – Maxime

+0

내 upda를 참조입니다 콘텐츠 형식 헤더에 대해 설명합니다. –

+0

나는 그것을 아무런 효과없이 시도했다. 도움을 주셔서 감사합니다 – Maxime

관련 문제