我在嘗試使用WeatherBug API(WSDL是here)。我試圖學習一些關於WCF的東西。將KnownTypeAttribute應用於對象類型?
我使用svcutil.exe從上面的鏈接中的WSDL創建類。
然後我試圖執行以下代碼來測試它:
var proxy = new WeatherBugWebServicesSoapClient();
var stations = proxy.GetStationListByUSZipCode("97211", UnitType.English, "myapikey");
我最終得到一個NetDispatcherFaultException
:
格式化拋出一個異常,而試圖反序列化 消息:嘗試反序列化參數 http://api.wxbug.net/:GetStationListByUSZipCodeResponse時出錯。 InnerException消息是'第1行位置352錯誤。元素 'http://api.wxbug.net/:anyType'包含來自類型的數據,該類型映射到 名稱'http://api.wxbug.net/:ApiStationData'。解串器有 沒有任何類型映射到這個名字的知識。考慮使用DataContractResolver或將'ApiStationData' 對應的類型添加到已知類型的列表中 - 例如,使用 KnownTypeAttribute屬性或將其添加到傳遞給DataContractSerializer的已知 類型的列表中。有關更多詳細信息,請參閱InnerException 。
似乎我應該得到背面ArrayOfAnyType
類型的一個對象,該聲明如下(由svcutil.exe的生成):
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.CollectionDataContractAttribute(Name = "ArrayOfAnyType", Namespace = "http://api.wxbug.net/", ItemName = "anyType")]
public class ArrayOfAnyType : System.Collections.Generic.List<object> {
}
陣列看起來應的ApiStationData
集合,其聲明如下:
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name = "ApiStationData", Namespace = "http://api.wxbug.net/")]
public partial class ApiStationData : object, System.Runtime.Serialization.IExtensibleDataObject {
從我讀過關於各種網頁,我覺得我需要添加一個KnownTypeAttribute
到Object
班,因爲ArrayOfAnyType
是List<object>
。我不認爲這是可能的,雖然(或正確)...
這也是奇怪的是,除了提到http://api.wxbug.net/:anyType
,但沒有在SvcUtil工具anyType
生成代碼的定義(這就是爲什麼我作出關於ArrayOfAnyType
的假設)。
有關如何解決此問題的任何建議?
目前我還不清楚應該應用KnownType。該示例顯示它適用於祖先,但ApiStationData的祖先是對象。幾乎所有由svctool生成的類都有'DataContactAttribute',所以當你說它應該被添加到數據契約時,你究竟是什麼意思? – Steve
它應該是包含'ArrayOfAnyType'屬性的一個,或者我認爲它也可以是'ArrayOfAnyType'本身。 –
工作就像一個魅力。我其實以爲我曾嘗試過,但我顯然沒有。謝謝您的幫助。下一個我可能會想到的問題是,爲什麼WSDL沒有足夠的信息讓svctool找出需要它的地方,或者爲什麼svctool不夠聰明。或者,這只是一個WCF的東西,不適用於其他語言...更多學習,這使它很有趣:) – Steve