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("&", "&");
data = data.Replace(""", """);
data = data.Replace("'", "'");
data = data.Replace("", ">");
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