嗨,無法反序列化具有根名稱「Binary」和根名稱空間的XML主體?
我(客戶端)試圖用ASP.NET WCF web服務進行溝通,一路上都來解決這個問題(這裏的更多信息:Connect to a password protected server with WCF over HTTP)。
當運行請求方法:
var proxy = factory.CreateChannel();
var response = proxy.GetMyData(id);
我得到以下異常:
無法反序列化XML主體與根名稱「二進制」和根命名空間'(操作「GetMyData」和使用XmlSerializer的合同('ICFService','http://tempuri.org/'))。確保將與XML相對應的類型添加到服務的已知類型集合中。說明:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。異常詳細信息:System.Runtime.Serialization.SerializationException:無法使用XmlSerializer反轉序列化具有根名稱'Binary'和根名稱空間''(用於操作'GetMyData'和合同('ICFService','http://tempuri.org/'))的XML主體。確保將與XML相對應的類型添加到服務的已知類型集合中。
難道這是一個編碼問題?我如何解決它?
BestRegards
EDIT1:我添加下面一行到 「服務」 的接口:
[ServiceKnownType(typeof(MyObject))]
但這並不解決問題。
我也想補充一點,一個新的異常已經斌現在拋出:
在根級別的數據無效。行1,位置1. 描述:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。 異常詳細信息:System.Xml.XmlException:根級別的數據無效。第1行,位置1.
這通常是我得到的第一個異常,但是當再次嘗試時,我得到另一個異常?
webservice被設置爲返回兩種類型的XML文檔,真正的消息包含一些信息並在我的應用程序中使其失效我已經使用XmlRoot和XmlElement屬性創建了corsponding類(這是我添加的類如服務界面所知的那樣)。可以返回的其他消息將只包含一個字符串,當發生這種情況時,可能會在我的客戶端拋出異常。因爲它試圖將數據變爲不支持它的類型。當我得到一個propper響應時,第二個異常(根級數據無效,第1行,位置1)可能是第一個異常(無法反序列化具有根名稱Binary的XML主體)我收到不支持的消息。
我認爲屬性和的ChannelFactory應該可以很容易,但我不能看到XML我回來因此Im現在想的我的解決方案切換到簡單的工作與XMLDocumet類。這不是一個好的解決方案,但我會看到發生了什麼事情。
EDIT2
如果我將自己的計算機上運行鍼對web服務的URL我會得到如下答覆:
<Error><code>E50</code><desc>IP Not Allowed</desc></Error>
僅此而已,如果我正確的服務器上運行(我的主機)重播應根據客戶是這樣的:
<Desc>
<Make cfe_code="98" cfe_value="Volkswagen" label="Märke" value="Volkswagen"/>
<ModelName cfe_code="99" cfe_value="Touareg" label="Modell" value="Touareg"/>
<BodyType cfe_code="212" cfe_value="22" label="Kaross" value="SUV"/>
...
</Desc>
Ë dit3:
現在我已經試過這個代碼在主機服務器上:
public XDocument GetMyData(string regNr)
{
WebClient wc = new WebClient();
wc.Credentials = new NetworkCredential("MyName", "MyPassword");
Stream s = wc.OpenRead("http://MyServer.com/ag/get?UID=9999999999.eu_vddsall_xml&VINREG=" + regNr + "&LANG=sv");
// return an XDocument for LINQ
XmlTextReader xmlReader = new XmlTextReader(s);
XDocument xdoc = XDocument.Load(xmlReader);
xmlReader.Close();
xdoc.Save(HostingEnvironment.MapPath("~/App_Data/Files/Xml/") + DateTime.Now.ToString("hhmmssfff") + ".xml");
return xdoc;
}
而這個偉大的工程!我得到一個包含以下內容的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<Desc>
<Vin cfe_code="11" cfe_value="X" label="Chassie nr" value="X" />
<Make cfe_code="98" cfe_value="Volvo" label="Märke" value="Volvo" />
<ModelName cfe_code="99" cfe_value="S70" label="Modell" value="S70" />
<BodyType cfe_code="212" cfe_value="1" label="Kaross" value="Sedan" />
...
</Desc>
那麼,爲什麼不是我的WCF版本的工作?
您可能想要編輯您的問題,並讓大家知道您已將[ServiceKnownType(typeof(MyObject))]添加到ICFService接口,但這不會改變任何東西 - 否則人們會從那裏開始:) – Tim
@Tim>謝謝!完成。 – Banshee