使用WebAPI中的HttpClient读取自定义内容类型(e.e.StackOverflow)提要

本文关键字:类型 StackOverflow 提要 中的 WebAPI HttpClient 读取 自定义 使用 | 更新日期: 2023-09-27 18:25:44

我很喜欢HttpClient的体系结构,但我不知道如何添加一个"不太标准"的媒体类型来由XmlSerializer处理。

此代码:

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

当指向内容类型为"text/xml"的原子提要时,效果良好,但示例中的原子提要失败,返回"没有可用的'MediaTypeFormatter'读取媒体类型为'application/atom+xml'的'Feed'类型的对象"消息。我尝试了为XmlMediaTypeFormatter指定MediaRangeMappings的不同组合(将作为参数传递给ReadAsAsync),但没有成功。

配置HttpClient以将"application/atom+xml"answers"application/rss+xml"映射到XmlSerializer的"推荐"方式是什么?

使用WebAPI中的HttpClient读取自定义内容类型(e.e.StackOverflow)提要

以下是有效的代码(归功于ASP.net论坛线程):

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子类化的解决方案?

问题是您试图将结果直接转换为Feed。正如错误明确指出的那样,它无法理解我们如何将application/atom+xml转换为Feed

您可能需要以XML的形式返回,然后使用和XmlReader初始化Feed。

另一种选择是提供自己的媒体格式化程序和封装它的实现。