2010-02-01 79 views
2

我試圖使用此link中提到的WCF REST入門工具包來使用此link中提到的Twitter的REST API。閱讀命名空間時ReadAsDataContract異常

我在DataContract中使用了與文章 - statusList和status中提到的相同的對象。

[assembly: ContractNamespace("", ClrNamespace = "TwitterShell")] 
[CollectionDataContract(Name = "statuses", ItemName = "status")] 
public class statusList : List<status> { } 
public class user 
{ 
    public string id; 
    public string name; 
    public string screen_name; 
} 
public class status 
{ 
    public string id; 
    public string text; 
    public user user; 
} 

我正在使用ReadAsDataContract()方法讀取XML內容。

HttpClient http = new HttpClient("http://twitter.com/statuses/"); 
http.TransportSettings.Credentials = 
    new NetworkCredential("{username}", "{password}"); 
HttpResponseMessage resp = http.Get("friends_timeline.xml"); 
resp.EnsureStatusIsSuccessful(); 
statusList sList = resp.Content.ReadAsDataContract<statusList>(); 

我得到以下例外。我還沒有定義下面的命名空間。

第1行位置出錯24.期望從名稱空間'http://schemas.datacontract.org/2004/07/sitename'的元素'狀態'..遇到名爲'狀態',名稱空間''的'元素'。

請幫忙。謝謝。

回答

3

只是不這樣做。如果您嘗試使用Datacontracts和操作合同來訪問非wcf服務,那麼您將處於一個痛苦的世界。

好了,我想這是一個有點不公平離開你高,乾燥,而不替代,那麼試試這個:

var response = client.Get("http://twitter.com/statuses/friends_timeline.xml"); 

var statuses = response.Content.ReadAsXElement(); 

var statusQuery = from st in statuses.Elements("status") 
        select new status { 
           id = st.Element("id").Value, 
           text = st.Element("text").Value, 
           user = (from us in st.Elements("user") 
             select new user { 
              id = us.Element("id").Value, 
              name = us.Element("name").Value, 
              screen_name = us.Element("screen_name").Value 
                 }).FirstOrDefault() 
             }; 
var statuses = statusQuery.ToList(); 

使用LINQ to XML來創建XML文檔對象可以讓你避免串行器的魔力,並完全控制客戶端對象的名稱和數據類型。這將是非常容易將保鮮膜這是一個新的HttpContent擴展方法,這樣你可以簡單地做:

var statuses = response.Content.ReadAsTwitterStatuses(); 
+0

感謝達雷爾,這個工程。 :-) – hIpPy 2010-02-02 16:20:02

0

我碰到你的帖子尋找答案,以同樣的問題,我能找到一個解決方案是什麼您正在尋找是否要放棄LINQ to XML方法。

1)確保您有以下裝飾

[DataContract (Namespace = "")] 

註解你的狀態類通過指定上述註解,你會覆蓋類的默認命名空間的命名空間。這應該解決你的命名空間問題。

2)爲了解決空值問題(我也經歷過),您的字段順序非常重要。當你的對象被反序列化時,它是按字母順序完成的。您可以使用DataMember註釋中的Order屬性來命令字段匹配傳入XML的順序。

例如

[DataMember (Order = 1)] 
public string text 

等等