使用WebAPI中的HttpClient读取自定义Content-Type(f.e. StackOverflow)提要

时间:2012-02-25 21:58:17

标签: c# .net wcf wcf-web-api

我非常喜欢HttpClient的架构 - 但我无法弄清楚如何添加一个“不太标准”的媒体类型来由XmlSerializer处理。

此代码:

var cli = new HttpClient();
cli
    .GetAsync("http://stackoverflow.com/feeds/tag?tagnames=delphi&sort=newest")
    .ContinueWith(task =>
    {
        task.Result.Content.ReadAsAsync<Feed>();
    }); 

在指向Content-Type为“text / xml”的原子提要时工作正常,但示例中的那个以“No'MediaTypeFormatter'可用于读取”Feed“类型的对象使用媒体类型'application / atom + xml'“消息。 我尝试了为XmlMediaTypeFormatter指定MediaRangeMappings的不同组合(作为参数传递给ReadAsAsync)但没有成功。

配置HttpClient以将“application / atom + xml”和“application / rss + xml”映射到XmlSerializer的“推荐”方法是什么?

2 个答案:

答案 0 :(得分:4)

以下是适用的代码(信用到ASP.net forum thread):

public class AtomFormatter : XmlMediaTypeFormatter
{
    public AtomFormatter()
    {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/atom+xml"));
    }

    protected override bool CanReadType(Type type)
    {
        return base.CanReadType(type) || type == typeof(Feed);
    }
}

var cli = new HttpClient();
cli
    .GetAsync("http://stackoverflow.com/feeds/tag?tagnames=delphi&sort=newest")
    .ContinueWith(task =>
    {
        task.Result.Content.ReadAsAsync<Feed>(new[] { new AtomFormatter });
    }); 

仍然,希望看到一个没有子类化XmlMediaTypeFormatter的解决方案 - 任何人?

答案 1 :(得分:0)

问题在于您尝试将结果直接转换为Feed。由于错误显而易见,它无法确定如何将application/atom+xml转换为Feed

您可能必须以XML格式返回,然后使用XmlReader初始化Feed。

替代方案是提供您自己的媒体格式化程序 - 以及封装它的实现。