Febrero 10

2018

SITEMAP EN ASP

El sitemap es un archivo XML que le dice a la araña de Google como esta organizada tu web. Hay muchas formas de hacer este fichero, manualmente, hoy por hoy, es casi una locura, ya que como norma general tendremos una base de datos que la gestión, ya sea para poner noticias o si es una web de una tienda de una tienda, para organizar todas las categorías o productos. Un fichero sitemap tiene la siguiente estructura XML

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.example.com/</loc>
<lastmod>2005-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
</urlset>

La estructura

La estructura es muy sencilla, cada pagina de nuestra web se incluye en un nodo llamado URL. Los subnodos son muy simples

  • loc: la dirección URL de la pagina web.
  • lastmod: fecha de la ultima modificación.
  • changefreq: frecuencia con que la araña de Google visitara la web. Lo mas utilizado es monthly y weekly (mensual y semanal respectivamente).
  • priority: la importancia dentro de la estructura de la web.

Manos a la obra

Para realizar esto esto con ASP tenemos varios métodos, pero el que os presento aquí es el que he visto mas fácil y, por ahora, es la primera vez que se documenta con esta solución, por lo menos para ASP con CSHARP. Esta idela la obtuve de un blog que era para PHP y de mi blog  CREAR UN RSS CON ASP NET EN CSHARP ya que se utiliza la misma solución.

Paso 1

Crear un fichero ASPX que va a ser el encargado de devolvernos el dichero XLS con el sitemap generado dinamicamente. Para ello debemos de implementar el fichero sitemap.aspx de la siguiente forma.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="sitemap.aspx.cs" Inherits="sitemap" %> 

Paso 2

Normalmente la web dispondrá de unas paginas fijas como son HOME, CONTACTO, LOGIN, REGISTRO, ACERCA DE, etc, etc. Pero al mismo tiempo necesitaremos consultar alguna base de datos ya sea de artículos de la tienda o de noticias, por lo que necesitaremos algún método para consultar la base de datos. Para todo esto vamos a crear un función que nos devuelve el contenido del fichero en formato XML.

    public string CreateSitemap()
{
MemoryStream ms = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(ms, System.Text.Encoding.UTF8);
writer.WriteStartDocument();
writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9");

//paginas estaticas
//home
writer.WriteStartElement("url");
writer.WriteElementString("loc", urls.Home());
writer.WriteElementString("lastmod", "2018-01-01");
writer.WriteElementString("changefreq", "monthly");
writer.WriteElementString("priority", "1");
writer.WriteEndElement();
//acerca de
writer.WriteStartElement("url");
writer.WriteElementString("loc", urls.AcercaDe());
writer.WriteElementString("lastmod", "2018-01-01");
writer.WriteElementString("changefreq", "monthly");
writer.WriteElementString("priority", "0.9");
writer.WriteEndElement();
//login
writer.WriteStartElement("url");
writer.WriteElementString("loc", urls.Login());
writer.WriteElementString("lastmod", "2018-01-01");
writer.WriteElementString("changefreq", "monthly");
writer.WriteElementString("priority", "0.8");
writer.WriteEndElement();
//registro
writer.WriteStartElement("url");
writer.WriteElementString("loc", urls.Registro());
writer.WriteElementString("lastmod", "2018-01-01");
writer.WriteElementString("changefreq", "monthly");
writer.WriteElementString("priority", "0.7");
writer.WriteEndElement();
//blogs
writer.WriteStartElement("url");
writer.WriteElementString("loc", urls.Blogs());
writer.WriteElementString("lastmod", "2018-01-01");
writer.WriteElementString("changefreq", "monthly");
writer.WriteElementString("priority", "0.6");
writer.WriteEndElement();
//eventos
writer.WriteStartElement("url");
writer.WriteElementString("loc", urls.Eventos());
writer.WriteElementString("lastmod", "2018-01-01");
writer.WriteElementString("changefreq", "monthly");
writer.WriteElementString("priority", "0.6");
writer.WriteEndElement();

DDBB cnn = new DDBB();
DataSet dsRSS = cnn.ConsultarConDataSet(querysSQL.Blogs());
cnn.Dispose();
cnn = null;

//paginas dinamicas de los blogs o eventos
drualcman.fechashoras f = new drualcman.fechashoras();
for (int i = 0; i < dsRSS.Tables[0].Rows.Count; i++)
{
writer.WriteStartElement("url");
writer.WriteElementString("loc", ManejoDatos.urlBlog(dsRSS.Tables[0].Rows[i]["IdBlog"].ToString()));
writer.WriteElementString("lastmod", f.ConvertirFechaSQL(dsRSS.Tables[0].Rows[i]["Fecha"].ToString()).Replace("/","-"));
writer.WriteElementString("changefreq", "monthly");
writer.WriteElementString("priority", "0.5");
writer.WriteEndElement();
}
f = null;


writer.WriteEndElement();
writer.Flush();

dsRSS.Dispose();
dsRSS = null;

byte[] buffer;
buffer = ms.ToArray();
return System.Text.Encoding.UTF8.GetString(buffer);
}

Paso 4

Ahora vamos a llamar a esta función desde el evento OnPreInit de la pagina, aunque también lo podemos llamar desde el evento Page_Load eso ya dependerá de como quieras manejar el asunto.
    protected override void OnPreInit(EventArgs e)
{
//Devolver un fichero XML con el sitemap
//para utilizarlo en la llamada al método CreateSitemap que haremos posteriormente
Response.ContentType = "application/xml";
Response.Write(this.CreateSitemap());
}

OJO!!!

Necesitamos incluir al comienzo del archivo sitemap.aspx.cs los siguientes namespaces

using System;
using System.Data;
using System.IO;
using System.Xml;

Paso 5

Por ultimo utilizamos el modulo re-write de IIS con una regla que cuando se pida la URL http://miweb.com/sitemal.xml realice la llamada a nuestro fichero sitemap.aspx y nos devuelva nuestro fichero XML con el sitemap de nuestra web

<rewrite>
<rules>
<rule name="Site Map">
<match url="^sitemap.xml" />
<action type="Rewrite" url="sitemap.aspx" />
</rule>
</rules>
</rewrite>

Recordar que esta regla se pude escribir, tal cual el ejemplo, en nuestro fichero web.config dentro de la etiqueta <system.webServer> .

Conclusion

Y esto es todo, con solo 5 pequeños pasos tendremos nuestro sitemap dinámico de una forma muy sencilla. Pueden ven el resultado accediendo directamente a mi fichero sitemap aqui. Mas informacion en los enlaces que os dejo, que son los que he consultado para llegar a este resumen.

#XML #CSHARP #web #ASP

1 Comentarios

    • Saturday, February 3, 2018 6:09 PM

    Muy bien tb!. Gracias!

Escribir un comentario

8 x 2 =



Archivo