在asp.net core 1.0中创建RSS订阅源

3

我正在使用Asp.net Core 1.0 MVC 6工作,尝试编写一个组件从我的网站提供RSS订阅源。

我在这篇帖子中发现,System.ServiceModel.Syndication尚未移植到ASP.NET CORE。

我不能针对完整的.NET框架进行目标定位。

建议编写一个xml解析器。但是,我仍然在努力理解可能需要的所有内容。

我已经构建了将数据转换为XML的功能,现在需要更好地了解如何允许从IActionResult调用它(或者如何生成可以放置在我的页面上的链接)。

我可以提供我的代码示例,但不确定是否有帮助。有谁能够指导我朝着实现这一目标的方向前进吗?

我还在此帖子中找到了一个答案,指向了一些想法,但我认为那是早期的MVC6/Asp.net Core。


1
我猜你只需要使用XmlWriter并将Xml写入响应即可。关键是要确保创建正确的结构并使用正确的名称和命名空间。 - Pawel
2个回答

4
// action to return the feed
[Route("site/GetRssFeed/{type}")]
public IActionResult GetRssFeed(ArticleStatusTypes type)
{
    var feed = _rss.BuildXmlFeed(type);
    return Content(feed, "text/xml");
}


public string BuildXmlFeed(ArticleStatusTypes type)
{
    var key = $"RssFeed{Convert.ToInt32(type)}{_appInfo.ApplicationId}";
    var articles =
            _cache.GetCachedData(key) ??
            _cache.SetCache(key, _service.GetItems(Convert.ToInt32(type), _appInfo.CacheCount));

    StringWriter parent = new StringWriter();
    using (XmlTextWriter writer = new XmlTextWriter(parent))
    {
        writer.WriteProcessingInstruction("xml-stylesheet", "title=\"XSL_formatting\" type=\"text/xsl\" href=\"/skins/default/controls/rss.xsl\"");

        writer.WriteStartElement("rss");
        writer.WriteAttributeString("version", "2.0");
        writer.WriteAttributeString("xmlns:atom", "http://www.w3.org/2005/Atom");

        // write out 
        writer.WriteStartElement("channel");

        // write out -level elements
        writer.WriteElementString("title", $"{_appInfo.ApplicationName} {type}" );
        writer.WriteElementString("link", _appInfo.WebsiteUrl);
        //writer.WriteElementString("description", Description);
        writer.WriteElementString("ttl", "60");

        writer.WriteStartElement("atom:link");
        //writer.WriteAttributeString("href", Link + Request.RawUrl.ToString());
        writer.WriteAttributeString("rel", "self");
        writer.WriteAttributeString("type", "application/rss+xml");
        writer.WriteEndElement();

        if (articles != null)
        {
            foreach (var article in articles)
            {
                writer.WriteStartElement("item");

                writer.WriteElementString("title", article.Title);
                writer.WriteElementString("link", _appInfo.WebsiteUrl); // todo build article path
                writer.WriteElementString("description", article.Summary);

                writer.WriteEndElement();
            }
        }

        // write out 
        writer.WriteEndElement();

        // write out 
        writer.WriteEndElement();
    }

    return parent.ToString();
}

3
他们发布了一个 Microsoft.SyndicationFeed 的预览 NuGet 包。在 dotnet/wcf 仓库中,他们提供了一个 示例 来帮助您快速上手。 编辑: 我发布了一个 Repo 和一个 NuGet 包,作为该中间件的补充。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接