Cómo crear un rss con ASP.net

Por medio de este tutorial, veremos como crear un Feed RSS para tu aplicación web. Hoy en día es algo casi fundamental que aquellos sitios que se vayan actualizando continuamente, tengan un sistema RSS por el que sus usuarios puedan estar al tanto de las últimas noticias publicadas en esa web.

Antes de nada, veamos en que consiste un RSS. Un Feed RSS no es mas que un archivo escrito en XML donde iremos colocando las últimas noticias que se van publicando. Este archivo debe de seguir un patrón determinado, para que luego sera identificado por los lectores de Feeds. Un ejemplo de RSS podría ser el siguiente:

<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0">

 
<channel>

   
<title>Your Website Name</title>

   
<link>http://www.yourdomain.com</link>

   
<description>Free RSS Tutorial</description>

   
<item>

     
<title>First Article</title>

     
<link>http://www.yourdomain.com/article.aspx?ID=1</link>

     
<description>The description of the first article.</description>

   
</item>

   
<item>

     
<title>Second Article</title>

     
<link>http://www.yourdomain.com/article.aspx?ID=2</link>

     
<description>The description of the second article.</description>

   
</item>

 
</channel>

</rss>

En la primera línea del documento, se le indica la versión XML que utilizaremos, así como el tipo de codificación de los caracteres.

La siguiente línea contiene el elemento “channel”. Este elemento es utilizado para describir el feed RSS. Este requiere de otros tres elementos.

  • Title: Define el título del canal.
  • Link: Define la url al canal.
  • Description: Contiene una descripción del canal.

Cada uno de los channel, tienen elementos “item”. Cada uno de estos elementos definen a una nueva noticia aparecida.

Los elementos item, requieren de otros tres tipos de elementos:

  • title: Define el título del item.
  • Link: Define la url hacia el item.
  • Description: Describe al item.

Normalmente, a la hora de crear un RSS, los datos son obtenidos de una base de datos, por lo que deberemos de tener una creada con los datos. Nosotros vamos a suponer que tenemos la siguiente estructura de datos.

  • ArticleID: Campo auto-incremento
  • Title: varchar (256)
  • Author: varchar(50)
  • Description: varchar(500)
  • DatePublished: datetime

El siguiente paso será la creación de la página rss.aspx, que será la encargada de mostrar el contenido de los datos en formato RSS. Para ello creamos el fichero con nombre rss.aspx y como el contenido tendrá formato XML, borramos todas las etiquetas HTML y dentro de la directiva @page, en el campo “ContentType” le indicamos que el contenido será “text/xml”.

Después de los cambios, deberemos de tener algo como lo siguiente.

<%@ Page Language="C#" ContentType="text/xml" AutoEventWireup="true" CodeBehind="rss.aspx.cs" Inherits="NettutsTutorial2.rss" %>

<asp:Repeater ID="RepeaterRSS" runat="server">
</asp:Repeater>

A continuación, queremos configurar la cadena de conexión del origen de datos, en el archivo Web.config. Al guardar la información de la cadena de conexión, vamos a evitar tener que codificar en el archivo de código subyacente. Esto simplifica las cosas, si la información cambia de cadena de conexión en el futuro. Colóquelo en la sección de “connectionStrings” bajo el elemento de configuración, así:

<connectionStrings>
 
<add name="ConnectionString" connectionString="Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|Nettuts.mdf;Integrated Security=True;User Instance=True"
   
providerName="System.Data.SqlClient" />
 
</connectionStrings>

El siguiente paso es sustituir ciertos caracteres que no permiten los ficheros XML, ya que forman parte de su sintaxis. En total son 5 estos caracteres que no aceptan. Para ello creamos una función, a la que le pasamos los datos y nos lo devuelve con esos caracteres codificados.

protected string RemoveIllegalCharacters(object input)
{
   
// cast the input to a string
   
string data = input.ToString();      

   
// replace illegal characters in XML documents with their entity references
    data
= data.Replace("&", "&amp;");
    data
= data.Replace(""", "&quot;");
    data = data.Replace("'", "&apos;");
    data = data.Replace("", "&gt;");

    return data;
}

El siguiente paso que haremos, será recuperar de la base de datos la información que queremos que aparezca en nuestro RSS. No es mas que una función que hace la consulta a la base de datos

protected void Page_Load(object sender, EventArgs e)
{
    // Get connection string from the web.config file
    string connString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

    // Create SqlConnection object
    SqlConnection sqlConn = new SqlConnection();
    sqlConn.ConnectionString = connString;

    // SQL query to retrieve data from database
    string sqlQuery = "SELECT TOP 10 ArticleID, Title, Author, Description, DatePublished FROM News ORDER BY DatePublished DESC";

    // Create SqlCommand object
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = sqlConn;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = sqlQuery;

    // open connection and then binding data into RepeaterRSS control
    sqlConn.Open();
    RepeaterRSS.DataSource = cmd.ExecuteReader();
    RepeaterRSS.DataBind();
    sqlConn.Close();
}

El último paso es mostrar los datos de la base de datos en el archivo RSS. Para ello utilizaremos un bucle para recorrer los datos obtenidos de la base de datos. No hay que olvidarse de llamar a la función que nos hace el cambio de los caracteres erróneos.

<%@ Page Language="C#" ContentType="text/xml" AutoEventWireup="true" CodeBehind="rss.aspx.cs" Inherits="NettutsTutorial2.rss" %>

<asp:Repeater ID="RepeaterRSS" runat="server">
       
<HeaderTemplate>
           
<rss version="2.0">
               
<channel>
                   
<title>Name of the Website</title>
                   
<link>http://www.yourdomain.com</link>
                   
<description>
                    Short description of the website.
                   
</description>
       
</HeaderTemplate>
       
<ItemTemplate>
           
<item>
               
<title><%# RemoveIllegalCharacters(DataBinder.Eval(Container.DataItem, "Title")) %></title>
               
<link>http://www.yourdomain.com/news.aspx?ID=<%# DataBinder.Eval(Container.DataItem, "ArticleID") %></link>
               
<author><%# RemoveIllegalCharacters(DataBinder.Eval(Container.DataItem, "Author"))%></author>
               
<pubDate><%# String.Format("{0:R}", DataBinder.Eval(Container.DataItem, "DatePublished"))%></pubDate>
               
<description><%# RemoveIllegalCharacters(DataBinder.Eval(Container.DataItem, "Description"))%></description>
       
</item>
       
</ItemTemplate>
       
<FooterTemplate>
               
</channel>
           
</rss>
       
</FooterTemplate>
</asp:Repeater>

Con esto ya habremos creado nuestra aplicación para genera el fichero RSS. Ahora veremos el código completo de los archivos utilizados.

rss.aspx

<%@ Page Language="C#" ContentType="text/xml" AutoEventWireup="true" CodeBehind="rss.aspx.cs" Inherits="NettutsTutorial2.rss" %>

<asp:Repeater ID="RepeaterRSS" runat="server">
       
<HeaderTemplate>
           
<rss version="2.0">
               
<channel>
                   
<title>Name of the Website</title>
                   
<link>http://www.yourdomain.com</link>
                   
<description>
                    Short description of the website.
                   
</description>
       
</HeaderTemplate>
       
<ItemTemplate>
           
<item>
               
<title><%# RemoveIllegalCharacters(DataBinder.Eval(Container.DataItem, "Title")) %></title>
               
<link>http://www.yourdomain.com/news.aspx?ID=<%# DataBinder.Eval(Container.DataItem, "ArticleID") %></link>
               
<author><%# RemoveIllegalCharacters(DataBinder.Eval(Container.DataItem, "Author"))%></author>
               
<pubDate><%# String.Format("{0:R}", DataBinder.Eval(Container.DataItem, "DatePublished"))%></pubDate>
               
<description><%# RemoveIllegalCharacters(DataBinder.Eval(Container.DataItem, "Description"))%></description>
       
</item>
       
</ItemTemplate>
       
<FooterTemplate>
               
</channel>
           
</rss>
       
</FooterTemplate>
</asp:Repeater>

rss.aspx.cs

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;

namespace NettutsTutorial2
{
    public partial class rss : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // Get connection string from web.config file
            string connString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;

            // Create SqlConnection object
            SqlConnection sqlConn = new SqlConnection();
            sqlConn.ConnectionString = connString;

            // SQL query to retrieve data from database
            string sqlQuery = "SELECT TOP 10 ArticleID, Title, Author, Description, DatePublished FROM News ORDER BY DatePublished DESC";

            // Create SqlCommand object
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = sqlConn;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = sqlQuery;

            // open connection and then binding data into RepeaterRSS control
            sqlConn.Open();
            RepeaterRSS.DataSource = cmd.ExecuteReader();
            RepeaterRSS.DataBind();
            sqlConn.Close();
        }

        protected string RemoveIllegalCharacters(object input)
        {
            // cast the input to a string
            string data = input.ToString();

            // replace illegal characters in XML documents with their entity references
            data = data.Replace("&", "&");
            data = data.Replace(""", """);
            data = data.Replace("'", "'");
            data = data.Replace("", ">");

            return data;
        }
    }
}

web.config

<?xml version="1.0"?>
<configuration>
       
<configSections>
               
<sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
                       
<sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
                               
<section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
                               
<sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
                                       
<section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>
                                       
<section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
                                       
<section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
                                       
<section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/>
                               
</sectionGroup>
                       
</sectionGroup>
               
</sectionGroup>
       
</configSections>
       
<appSettings/>
       
<connectionStrings>
               
<add name="ConnectionString" connectionString="Data Source=.SQLEXPRESS;AttachDbFilename=|DataDirectory|Nettuts.mdf;Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient"/>
       
</connectionStrings>
       
<system.web>
               
<!--
            Set compilation debug="true" to insert debugging
            symbols into the compiled page. Because this
            affects performance, set this value to true only
            during development.
        -->

               
<compilation debug="true">
                       
<assemblies>
                               
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
                               
<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
                               
<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
                               
<add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
                       
</assemblies>
               
</compilation>
               
<!--
            The <authentication> section enables configuration
            of the security authentication mode used by
            ASP.NET to identify an incoming user.
        -->

               
<authentication mode="Windows"/>
               
<!--
            The <customErrors> section enables configuration
            of what to do if/when an unhandled error occurs
            during the execution of a request. Specifically,
            it enables developers to configure html error pages
            to be displayed in place of a error stack trace.

        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
            <error statusCode="403" redirect="NoAccess.htm" />
            <error statusCode="404" redirect="FileNotFound.htm" />
        </customErrors>
        -->

               
<pages>
                       
<controls>
                               
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
                               
<add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
                       
</controls>
               
</pages>
               
<httpHandlers>
                       
<remove verb="*" path="*.asmx"/>
                       
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
                       
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
                       
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
               
</httpHandlers>
               
<httpModules>
                       
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
               
</httpModules>
       
</system.web>
       
<system.codedom>
               
<compilers>
                       
<compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
                               
<providerOption name="CompilerVersion" value="v3.5"/>
                               
<providerOption name="WarnAsError" value="false"/>
                       
</compiler>
               
</compilers>
       
</system.codedom>
       
<!--
        The system.webServer section is required for running ASP.NET AJAX under Internet
        Information Services 7.0.  It is not necessary for previous version of IIS.
    -->

       
<system.webServer>
               
<validation validateIntegratedModeConfiguration="false"/>
               
<modules>
                       
<remove name="ScriptModule"/>
                       
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
               
</modules>
               
<handlers>
                       
<remove name="WebServiceHandlerFactory-Integrated"/>
                       
<remove name="ScriptHandlerFactory"/>
                       
<remove name="ScriptHandlerFactoryAppServices"/>
                       
<remove name="ScriptResource"/>
                       
<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
                       
<add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
                       
<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
               
</handlers>
       
</system.webServer>
       
<runtime>
               
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
                       
<dependentAssembly>
                               
<assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/>
                               
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
                       
</dependentAssembly>
                       
<dependentAssembly>
                               
<assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/>
                               
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/>
                       
</dependentAssembly>
               
</assemblyBinding>
       
</runtime>
</configuration>

Fuente: net.tutsplus

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP