2009-05-28 4 views
3

IN .NET 3.5 Je connais les classes System.ServiceModel.Syndication qui peuvent créer des flux rss Atom 1.0 et RSS 2.0. Est-ce que quelqu'un sait d'un moyen de générer facilement Media RSS de Yahoo dans ASP.Net? Je suis à la recherche d'un moyen gratuit et rapide de générer un flux MRSS.Générer un flux RSS (MRSS) Media dans ASP.NET 3.5

+0

J'ai en fait quelqu'un de mon équipe qui travaille sur ce sujet, en essayant d'utiliser la classe SyndicationFeed intégré. Il vient de m'annoncer qu'il croit avoir trouvé une solution et j'espère pouvoir en poster un bientôt. – James

+0

ce serait génial s'il vous plaît envoyer – chrisg

+0

J'ai trouvé cela aussi comme une alternative LINQ à XML http://code-inside.de/blog-in/2008/07/01/howto-use-piclens-and-other-mediarss- clients-pour-votre-propre-site-web-créer-mediarss-avec-linq-à-xml/ – chrisg

Répondre

2

Voici une solution simplifiée, je fini par utiliser dans un HttpHandler (de ashx):

 public void GenerateRss(HttpContext context, IEnumerable<Media> medias) 
    { 
     context.Response.ContentType = "application/rss+xml"; 
     XNamespace media = "http://search.yahoo.com/mrss"; 
     List<Media> videos2xml = medias.ToList(); 

     XDocument rss = new XDocument(
      new XElement("rss", new XAttribute("version", "2.0"), 
       new XElement("channel", 
        new XElement("title", ""), 
        new XElement("link", ""), 
        new XElement("description", ""), 
        new XElement("language", ""), 
        new XElement("pubDate", DateTime.Now.ToString("r")), 
        new XElement("generator", "XLinq"), 

        from v in videos2xml 
        select new XElement("item", 
           new XElement("title", v.Title.Trim()), 
           new XElement("link", "", 
            new XAttribute("rel", "alternate"), 
            new XAttribute("type", "text/html"), 
            new XAttribute("href", String.Format("/Details.aspx?vid={0}", v.ID))), 
           new XElement("id", NotNull(v.ID)), 
           new XElement("pubDate", v.PublishDate.Value.ToLongDateString()), 
           new XElement("description", 
            new XCData(String.Format("<a href='/Details.aspx?vid={1}'> <img src='/Images/ThumbnailHandler.ashx?vid={1}' align='left' width='120' height='90' style='border: 2px solid #B9D3FE;'/></a><p>{0}</p>", v.Description, v.ID))), 
           new XElement("author", NotNull(v.Owner)), 
           new XElement("link", 
            new XAttribute("rel", "enclosure"), 
            new XAttribute("href", String.Format("/Details.aspx?vid={0}", v.ID)), 
            new XAttribute("type", "video/wmv")), 
           new XElement(XName.Get("title", "http://search.yahoo.com/mrss"), v.Title.Trim()), 
           new XElement(XName.Get("thumbnail", "http://search.yahoo.com/mrss"), "", 
            new XAttribute("url", String.Format("/Images/ThumbnailHandler.ashx?vid={0}", v.ID)), 
            new XAttribute("width", "320"), 
            new XAttribute("height", "240")), 
           new XElement(XName.Get("content", "http://search.yahoo.com/mrss"), "a", 
            new XAttribute("url", String.Format("/Details.aspx?vid={0}", v.ID)), 
            new XAttribute("fileSize", Default(v.FileSize)), 
            new XAttribute("type", "video/wmv"), 
            new XAttribute("height", Default(v.Height)), 
            new XAttribute("width", Default(v.Width)) 
            ) 
          ) 
        ) 
       ) 
       ); 

     using (XmlWriter writer = new XmlTextWriter(context.Response.OutputStream, Encoding.UTF8)) 
     { 
      try 
      { 
       rss.WriteTo(writer); 
      } 
      catch (Exception ex) 
      { 
       Log.LogError("VideoRss", "GenerateRss", ex); 
      } 
     } 

    } 
1

Étape 1: Convertir vos données en XML:

Alors, donné une liste de photos:

var photoXml = new XElement("photos", 
    new XElement("album", 
    new XAttribute("albumId", albumId), 
    new XAttribute("albumName", albumName), 
    new XAttribute("modified", DateTime.Now.ToUniversalTime().ToString("r")), 
     from p in photos 
     select 
      new XElement("photo", 
      new XElement("id", p.PhotoID), 
      new XElement("caption", p.Caption), 
      new XElement("tags", p.StringTags), 
      new XElement("albumId", p.AlbumID), 
      new XElement("albumName", p.AlbumName) 
      ) // Close element photo 
    ) // Close element album 
);// Close element photos 

Étape 2: Lancez le XML à travers une XSLT:

Ensuite, en utilisant quelque chose comme suivant, exécutez cela à travers some XSLT, où xslPath est le chemin d'accès à votre XSLT, courant est le HttpContext actuel:

var xt = new XslCompiledTransform(); 
xt.Load(xslPath); 

var ms = new MemoryStream(); 

if (null != current){ 
    var xslArgs = new XsltArgumentList(); 
    var xh = new XslHelpers(current); 
    xslArgs.AddExtensionObject("urn:xh", xh); 

    xt.Transform(photoXml.CreateNavigator(), xslArgs, ms); 
} else { 
    xt.Transform(photoXml.CreateNavigator(), null, ms); 
} 

// Set the position to the beginning of the stream. 
ms.Seek(0, SeekOrigin.Begin); 

// Read the bytes from the stream. 
var byteArray = new byte[ms.Length]; 
ms.Read(byteArray, 0, byteArray.Length); 

// Decode the byte array into a char array 
var uniEncoding = new UTF8Encoding(); 
var charArray = new char[uniEncoding.GetCharCount(
    byteArray, 0, byteArray.Length)]; 
uniEncoding.GetDecoder().GetChars(
    byteArray, 0, byteArray.Length, charArray, 0); 
var sb = new StringBuilder(); 
sb.Append(charArray); 

// Returns the XML as a string 
return sb.ToString(); 

J'ai ces deux bits de code assis dans une méthode "BuildPhotoStream".

La classe "XslHelpers" contient les éléments suivants:

public class XslHelpers{ 
    private readonly HttpContext current; 

    public XslHelpers(HttpContext currentContext){ 
    current = currentContext; 
    } 

    public String ConvertDateTo822(string dateTime){ 
    DateTime original = DateTime.Parse(dateTime); 

    return original.ToUniversalTime() 
     .ToString("ddd, dd MMM yyyy HH:mm:ss G\"M\"T"); 
    } 

    public String ServerName(){ 
    return current.Request.ServerVariables["Server_Name"]; 
    } 
} 

Cela me fournit essentiellement avec une belle mise en forme des dates que XSLT doens't me donner.

Etape 3: le rendu XML résultant à l'application client:

« BuildPhotoStream » est appelé par « RenderHelpers.Photos » et « RenderHelpers.LatestPhotos », qui sont responsables pour obtenir les détails de la photo du Linq2Sql objets, et ils sont appelés à partir d'une page ASPX vide (je sais maintenant que cela devrait vraiment être un gestionnaire d'ASHX, je suis tout simplement pas eu l'occasion de le fixer):

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.ContentType = "application/rss+xml"; 
    ResponseEncoding = "UTF-8"; 

    if (!string.IsNullOrEmpty(Request.QueryString["AlbumID"])) 
    { 
     Controls.Add(new LiteralControl(RenderHelpers 
     .Photos(Server.MapPath("/xsl/rssPhotos.xslt"), Context))); 
    } 
    else 
    { 
     Controls.Add(new LiteralControl(RenderHelpers 
     .LatestPhotos(Server.MapPath("/xsl/rssLatestPhotos.xslt"), Context))); 
    } 
} 

A la fin de tout cela, Je me retrouve avec ceci:

http://www.doodle.co.uk/Albums/Rss.aspx?AlbumID=61

qui a travaillé dans Cooliris/PicLens quand je l'ai mis en place, mais semble maintenant de rendre les images dans le plan de réflexion, et lorsque vous cliquez sur eux, mais pas dans la vue murale :(

Si vous l'avez manqué ci-dessus, le XSLT se trouve ici:

http://www.doodle.co.uk/xsl/rssPhotos.xslt

Vous devrez évidemment l'éditer en fonction de vos besoins (et l'ouvrir dans quelque chose comme Visual Studio - FF cache la plupart des stylesheet def, y compris xmlns: atom = "http://www.w3.org/2005/Atom "xmlns: media =" http://search.yahoo.com/mrss ").

+0

Cela semble beaucoup de travail étant donné que la seule chose qui manque à la classe SyndicationFeed est la possibilité de définir xmlns: media = "http://search.yahoo.com/mrss" dans la balise . – James

+0

Pour être honnête, j'ai écrit cela dans .NET 2.0 avant que les trucs de flux de syndication soient sortis. Ce n'est pas tout ce travail;) Je suppose qu'avec une quantité de travail différente, on pourrait facilement se débarrasser du nouveau SyndicationFeedFormatter qui gère les flux MRSS, je ne l'ai pas encore regardé c'est tout. –

1

j'ai pu ajouter l'espace de noms de médias à la balise rss en procédant comme suit:

XmlDocument feedDoc = new XmlDocument(); 
feedDoc.Load(new StringReader(xmlText)); 
XmlNode rssNode = feedDoc.DocumentElement; 
// You cant directly set the attribute to anything other then then next line. So you have to set the attribute value on a seperate line. 
XmlAttribute mediaAttribute = feedDoc.CreateAttribute("xmlns", "media", "http://www.w3.org/2000/xmlns/"); 
mediaAttribute.Value = "http://search.yahoo.com/mrss/"; 
rssNode.Attributes.Append(mediaAttribute); 

return feedDoc.OuterXml; 
0

Juste pour ajouter une autre option pour référence future:

J'ai créé une bibliothèque qui exploite les classes SyndicationFeed dans .NET et vous permet de lire et d'écrire des flux rss de médias.

http://mediarss.codeplex.com