2017-02-01 9 views
0

私は、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.dll

の 'System.Runtime.Serialization.SerializationException' をタグなしでは、私はそれを動作させることはできません。

+0

私は – Maxime

答えて

1

ご覧のとおり、私は、整形式で非常にシンプルなXML文書だと思います。

残念ながら、あなたの仮定が間違っている:無効なXMLをだ

<KPISheet>site>mysite</site> 

。サイトタグには<がありません。また、あなたのXMLの最後の文字として、)という閉鎖があるようです。

だからあなたは、有効な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>") 

はまた、正しいコンテンツタイプがtext/xmlなくapplication/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クラスと一致する名前空間を調整することを忘れないでください。

また、あなたが使用されている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を参照してください。大丈夫です... JSONに私の負荷を変え、そして魔法のようにthatsの仕事終わりましたコンテンツタイプヘッダーについて。 –

+0

私はそれを試みましたが、何の効果もありませんでした。あなたの助けをありがとう – Maxime

関連する問題