2013-12-20 25 views
0

我在嘗試使用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 { 

從我讀過關於各種網頁,我覺得需要添加一個KnownTypeAttributeObject班,因爲ArrayOfAnyTypeList<object>。我不認爲這是可能的,雖然(或正確)...

這也是奇怪的是,除了提到http://api.wxbug.net/:anyType,但沒有在SvcUtil工具anyType生成代碼的定義(這就是爲什麼我作出關於ArrayOfAnyType的假設)。

有關如何解決此問題的任何建議?

回答

2

KnownTypeAttribute用於數據合同,不是目標類型 - 由於很多原因,這實際上是不切實際的。檢查示例部分here爲應用程序。

從你的情況看來,數據契約並不知道ApiStationData類型,所以在數據契約中添加[KnownType(typeof (ApiStationData))]應該可以解決問題。

+0

目前我還不清楚應該應用KnownType。該示例顯示它適用於祖先,但ApiStationData的祖先是對象。幾乎所有由svctool生成的類都有'DataContactAttribute',所以當你說它應該被添加到數據契約時,你究竟是什麼意思? – Steve

+1

它應該是包含'ArrayOfAnyType'屬性的一個,或者我認爲它也可以是'ArrayOfAnyType'本身。 –

+1

工作就像一個魅力。我其實以爲我曾嘗試過,但我顯然沒有。謝謝您的幫助。下一個我可能會想到的問題是,爲什麼WSDL沒有足夠的信息讓svctool找出需要它的地方,或者爲什麼svctool不夠聰明。或者,這只是一個WCF的東西,不適用於其他語言...更多學習,這使它很有趣:) – Steve

相關問題