我非常喜欢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的“推荐”方法是什么?
答案 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。
替代方案是提供您自己的媒体格式化程序 - 以及封装它的实现。