使用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的"推荐"方式是什么?
以下是有效的代码(归功于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。
另一种选择是提供自己的媒体格式化程序和封装它的实现。