2012-09-15 137 views
5

我正在尋找通過MVC4(和/或WebAPI)創建RSS訂閱源的最佳方法。這篇文章似乎是最適用的http://www.strathweb.com/2012/04/rss-atom-mediatypeformatter-for-asp-net-webapi/。但它是在WebAPI的預發佈日期中編寫的。我用的NuGet把所有包了最新的,但試圖建立項目扔:在MVC4/WebAPI中創建RSS訂閱源

Error 2 The type or namespace name 'FormatterContext' could not be found (are you missing a using directive or an assembly reference?) G:\Code\MvcApplication-atomFormatter\MvcApplication-atomFormatter\SyndicationFeedFormatter.cs 38 129 MvcApplication_syndicationFeedFormatter 

我發現了一些文章解釋說,MediaTypeFormatter自公測顯著改變,但我發現有關代碼段所需調整的詳細信息。

是否有更新的資源顯示RSSFormatter的構建?

THX

回答

8

是我寫的教程針對測試版。

以下是更新爲RTM版本的代碼。

一個建議,如果可能的話,就是這個例子使用一個簡單的「白名單」來構建RSS/Atom feed的具體類型(在這種情況下,我的Url模型)。理想情況下,在更復雜的場景中,您可以將格式化程序設置爲針對接口而不是具體類型,並讓所有模型都應該作爲RSS公開以實現該接口。

希望這會有所幫助。

public class SyndicationFeedFormatter : MediaTypeFormatter 
    { 
     private readonly string atom = "application/atom+xml"; 
     private readonly string rss = "application/rss+xml"; 

     public SyndicationFeedFormatter() 
     { 
      SupportedMediaTypes.Add(new MediaTypeHeaderValue(atom)); 
      SupportedMediaTypes.Add(new MediaTypeHeaderValue(rss)); 
     } 

     Func<Type, bool> SupportedType = (type) => 
     { 
      if (type == typeof(Url) || type == typeof(IEnumerable<Url>)) 
       return true; 
      else 
       return false; 
     }; 

     public override bool CanReadType(Type type) 
     { 
      return SupportedType(type); 
     } 

     public override bool CanWriteType(Type type) 
     { 
      return SupportedType(type); 
     } 

     public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, System.Net.Http.HttpContent content, System.Net.TransportContext transportContext) 
     { 
      return Task.Factory.StartNew(() => 
      { 
       if (type == typeof(Url) || type == typeof(IEnumerable<Url>)) 
        BuildSyndicationFeed(value, writeStream, content.Headers.ContentType.MediaType); 
      }); 
     } 

     private void BuildSyndicationFeed(object models, Stream stream, string contenttype) 
     { 
      List<SyndicationItem> items = new List<SyndicationItem>(); 
      var feed = new SyndicationFeed() 
      { 
       Title = new TextSyndicationContent("My Feed") 
      }; 

      if (models is IEnumerable<Url>) 
      { 
       var enumerator = ((IEnumerable<Url>)models).GetEnumerator(); 
       while (enumerator.MoveNext()) 
       { 
        items.Add(BuildSyndicationItem(enumerator.Current)); 
       } 
      } 
      else 
      { 
       items.Add(BuildSyndicationItem((Url)models)); 
      } 

      feed.Items = items; 

      using (XmlWriter writer = XmlWriter.Create(stream)) 
      { 
       if (string.Equals(contenttype, atom)) 
       { 
        Atom10FeedFormatter atomformatter = new Atom10FeedFormatter(feed); 
        atomformatter.WriteTo(writer); 
       } 
       else 
       { 
        Rss20FeedFormatter rssformatter = new Rss20FeedFormatter(feed); 
        rssformatter.WriteTo(writer); 
       } 
      } 
     } 

     private SyndicationItem BuildSyndicationItem(Url u) 
     { 
      var item = new SyndicationItem() 
      { 
       Title = new TextSyndicationContent(u.Title), 
       BaseUri = new Uri(u.Address), 
       LastUpdatedTime = u.CreatedAt, 
       Content = new TextSyndicationContent(u.Description) 
      }; 
      item.Authors.Add(new SyndicationPerson() { Name = u.CreatedBy }); 
      return item; 
     } 
    } 
+0

我正想着爲我的web api實現這個。 我希望做的最重要的一件事是做一個聯合屬性,所以我可以標記我的類與標題等 –

+0

任何想法如何做到這一點與aspvnext位? –

+0

根本不適合,aspnetvnext將完全獨立於當前的Web API或當前MVC –