2016-07-11 97 views
3

我正在使用Asp.net核心1.0 MVC 6 我正在嘗試編寫一個組件來提供來自我的網站的RSS源。在asp.net核心1.0中創建RSS源

我發現this post表明System.ServiceModel.Syndication尚未被移植到ASP.NET CORE。

我無法定位完整的.NET框架。

建議是編寫一個XML解析器。然而,我正在竭力想要解決所有可能需要的一切。

我已經構建了將我的數據轉換爲XML的功能,但現在需要更好地理解如何從IActionResult(或實際上如何生成可能放置在我的頁面上的鏈接)調用此功能。

我可以提供我的代碼樣本,但不知道它會有幫助。 有沒有人能夠指出我實現這個目標的正確方向?

我也發現了這個帖子上指向對某些想法的答案,但我認爲這是預MVC6/Asp.net核心:RSS Feeds in ASP.NET MVC

+1

我想你會只使用XmlWriter並將Xml寫入響應。關鍵是確保你創建一個正確的結構並使用正確的名稱和命名空間。 – Pawel

回答

2
// 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(); 
    }