2012-09-15 44 views
5

Estoy buscando la mejor manera de crear una fuente RSS a través de MVC4 (y/o WebAPI). Esta publicación parecía la más aplicable http://www.strathweb.com/2012/04/rss-atom-mediatypeformatter-for-asp-net-webapi/. Pero fue escrito en los días anteriores a la publicación de WebAPI. He usado Nuget para llevar todos los paquetes hasta a la fecha, pero el intento de construir el proyecto arroja:Crear fuente RSS en MVC4/WebAPI

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 

he encontrado una serie de artículos que explican que el MediaTypeFormatter ha cambiado significativamente desde la beta, pero he encontrado detalles sobre los ajustes requeridos para el fragmento de código en cuestión.

¿Hay algún recurso actualizado que muestre la construcción de un formato RSSFormatter?

THX

Respuesta

8

Sí me escribió que tutorial contra Beta.

A continuación se muestra el código actualizado a la versión RTM.

Un consejo, si se me permite, es que este ejemplo usa una simple "lista blanca" de tipos de concreto para los que se crea RSS/Atom feed (en este caso mi modelo Url). Idealmente en escenarios más complejos, tendría el formateador configurado contra una interfaz, en lugar de un tipo concreto, y tendría todos los Modelos que se supone que están expuestos como RSS para implementar esa interfaz.

Espero que esto ayude.

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

Estoy pensando en implementar esto para mi aplicación web. Lo único que quiero hacer al respecto es hacer un atributo de sindicación para poder marcar mis clases con el título, etc. –

+0

¿Alguna idea de cómo hacer esto con los bits de aspvnext? –

+0

no se ajusta para nada, aspnetvnext será completamente independiente de la API web actual o MVC actual –