2010-02-01 45 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 

等等