读取命名空间时ReadAsDataContract异常

时间:2010-02-01 22:54:47

标签: wcf rest namespaces

我正在尝试使用此link中提到的WCF REST入门套件来使用此link中提到的Twitter的REST api。

我正在使用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”的元素“状态”。遇到名为“statuses”的'Element',名称空间''。

请帮忙。感谢。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

我发现你的帖子正在搜索相同问题的答案,如果你想放弃LINQ to XML方法,我能找到你正在寻找的解决方案。

1)确保使用以下装饰

注释您的Status类
[DataContract (Namespace = "")]

通过指定上述注释,您将从类的默认命名空间覆盖命名空间。这应该可以解决您的命名空间问题。

2)为了解决空值问题(我也经历过),你的字段顺序非常重要。对象反序列化后,按字母顺序完成。您可以使用DataMember批注上的Order属性来命令字段与传入XML的顺序匹配。

e.g。

[DataMember (Order = 1)]
public string text
等等......