SyndicationFeed не добавляет атрибут rel = «self»

#.net #atom-feed #syndication-feed #syndicationfeed

#.net #atom-feed #syndication-feed #syndicationfeed

Вопрос:

Я использую SyndicationFeed для создания фида Atom.

Кажется, у меня все работает, за исключением случаев, когда я использую службу проверки ленты W3C для проверки своей ленты, я получаю следующее предупреждение.

Этот канал действителен, но совместимость с самым широким кругом читателей каналов может быть улучшена путем реализации следующих рекомендаций. строка 2, столбец 0: отсутствует атом: ссылка с rel=»self»

Достаточно просто добавить атрибут к тегу, который я создал, но как я могу SyndicationFeed его добавить? Я не вижу настройки для этого.

Вот первая часть моей ленты.

 <?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-us">
   <title type="text">Insider Articles</title>
   <subtitle type="text">Insider Articles data feed.</subtitle>
   <id>http://www.insiderarticles.com/Syndication/Atom</id>
   <rights type="text">Copyright (c) 2016 Insider Articles. All Rights Reserved.</rights>
   <updated>2016-10-02T12:47:21-07:00</updated>
   <logo>http://www.insiderarticles.com/Content/Images/rss.jpg</logo>
   <link rel="alternate" href="http://www.insiderarticles.com/" />
   <entry>
   <!-- Etc... -->
  

Вот как я создаю свою ленту (за вычетом элементов ленты).

 // Construct feed
SyndicationFeed feed = new SyndicationFeed(
    Properties.Settings.Default.ApplicationName,
    Properties.Settings.Default.FeedSummary,
    new Uri(Properties.Settings.Default.ApplicationDomainRoot),
    string.Format("{0}/Syndication/Atom", Properties.Settings.Default.ApplicationDomainRoot),
        DateTime.Now);
    feed.Language = "en-us";
    feed.Copyright = new TextSyndicationContent(Properties.Settings.Default.ApplicationCopyright);
    feed.ImageUrl = new Uri(string.Format("{0}/Content/Images/rss.jpg", uriRoot));
    feed.Items = items;
  

Ответ №1:

Хотя мой приведенный выше код добавляет альтернативную ссылку ( rel="alternate" ), проверяющему также требуется ссылка на исходный канал ( rel="self" ) .

Итак, добавление следующего кода устранило проблему.

 string feedUrl = string.Format("{0}/Syndication/Atom", UrlBuilder.GetUriRoot(uri));

// Add feed (self) URL
var link = new SyndicationLink(new Uri(feedUrl));
link.RelationshipType = "self";
feed.Links.Add(link);