我正在开发一个 ASP.Net Web API 项目。
需要返回应用程序中资源更改的 ATOM 提要。
我的提要一切正常,但由于某种原因,我的提要元素省略了将 XML 描述为 ATOM 提要的“xmlns”元素。
期望的结果是:
<?xml version="1.0" encoding="utf-8" ?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title type="text">My Feed</title>
<id>uuid:ff389357-aaab-4814-8916-b8fff325e6bb;id=22</id>
<updated>2013-04-11T16:15:10Z</updated>
<entry>
<id>uuid:ff389357-aaab-4814-8916-b8fff325e6bb;id=23</id>
<title type="text">Data.Parliament Resource 1</title>
<updated>2013-04-11T16:15:10Z</updated>
<author>
<name>Parliament System X</name>
</author>
</entry>
</feed>
但我的提要看起来像:
<?xml version="1.0" encoding="utf-8" ?>
<feed>
<title type="text">My Feed</title>
<id>uuid:ff389357-aaab-4814-8916-b8fff325e6bb;id=22</id>
<updated>2013-04-11T16:15:10Z</updated>
<entry>
<id>uuid:ff389357-aaab-4814-8916-b8fff325e6bb;id=23</id>
<title type="text">Data.Parliament Resource 1</title>
<updated>2013-04-11T16:15:10Z</updated>
<author>
<name>Parliament System X</name>
</author>
</entry>
</feed>
注意 'feed' 元素上缺少的 'xmlns' 属性。
我找了高低都无济于事...
问题:
谁能向我解释为什么缺少“xmlns”元素以及如何将其放回那里???
下面是 ATOM 媒体类型格式化程序的代码:
public class AtomMediaTypeFormatter : BufferedMediaTypeFormatter
{
private const string AtomMediaType = "application/atom+xml";
private IFeedHelper _feedService;
public AtomMediaTypeFormatter(IFeedHelper feedService)
{
this._feedService = feedService;
SupportedMediaTypes.Add(new MediaTypeHeaderValue(AtomMediaType));
this.AddQueryStringMapping("format", "atom", AtomMediaType);
}
public override bool CanWriteType(Type type)
{
return type.Implements<IFeedEntry>() || type.Implements<IFeed>();
}
/// <summary>
/// DDP is not currently supporting this operation.
/// </summary>
public override object ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
{
throw new NotImplementedException();
}
/// <summary>
/// Writes the given object value of type <param name="type"></param> to the given stream
/// </summary>
public override void WriteToStream(Type type, object value, Stream writeStream, HttpContent content)
{
using (writeStream)
{
var feed = value as IFeed;
if (feed != null)
{
WriteAtomFeed(feed, writeStream);
}
else
{
WriteAtomEntry((IFeedEntry)value, writeStream);
}
}
}
private void WriteAtomFeed(IFeed feed, Stream writeStream)
{
var formatter = new Atom10FeedFormatter(_feedService.Syndicate(feed));
using (var writer = XmlWriter.Create(writeStream))
{
formatter.WriteTo(writer);
}
}
private void WriteAtomEntry(IFeedEntry feedEntry, Stream writeStream)
{
var formatter = new Atom10ItemFormatter(_feedService.Syndicate(feedEntry));
using (var writer = XmlWriter.Create(writeStream))
{
formatter.WriteTo(writer);
}
}
}
这是 FeedService.Sydncate(IFeed) 方法的代码:
/// <summary>
/// Instantiates and returns a SyndicationFeed using the values of the given IFeed instance
/// </summary>
public SyndicationFeed Syndicate(IFeed feed)
{
var atomFeed = new SyndicationFeed
{
Title = new TextSyndicationContent(feed.Title),
Id = feed.Id,
Items = feed.Items.Select(i => Syndicate(i)),
LastUpdatedTime = feed.LastUpdated
};
atomFeed.Links.Add(new SyndicationLink(new Uri(feed.Link.Href), feed.Link.Href, "", "", default(long)));
return atomFeed;
}
最后是 FeedService.Sydncate(IFeedEntry):
/// <summary>
/// Instantiates and returns a SyndicationItem using the values of the given IFeedEntry instance
/// </summary>
public SyndicationItem Syndicate(IFeedEntry feedEntry)
{
var item = new SyndicationItem
{
Id = feedEntry.Id,
Title = new TextSyndicationContent(feedEntry.Title, TextSyndicationContentKind.Plaintext),
LastUpdatedTime = feedEntry.LastUpdated
};
item.Authors.Add(new SyndicationPerson("", feedEntry.Author, ""));
if (feedEntry.Links != null)
{
foreach (var link in feedEntry.Links)
{
item.Links.Add(new SyndicationLink(new Uri(link.ToString())));
}
}
return item;
}