O sitemap é um arquivo XML que contém URLs das páginas do seu site. Embora este arquivo seja uma das melhores formas dos buscadores encontrarem nossas páginas, isso não garantirá que todas serão indexadas. Mas sem duvida é um arquivo importantíssimo.
Existem muitos sites que geram sitemaps automaticamente, basta informar a URL que ele gera tudo automaticamente. Um exemplo de site que gera sitemaps é este:
www.xml-sitemaps.com
Agora pra quem tem conteúdo dinâmico, como produtos, usar um destes sites para gerar o sitemap será inviável. Então neste artigo vou mostrar como gerar um sitemap automaticamente em ASP.NET.
O arquivo deve ser no formato XML, mas não quer dizer que a extensão precisa ser esta, a extensão do sitemap pode ser ASP.NET (sitemap.aspx).
Abaixo vou mostrar uma estrutura básica de um sitemap que constituída de
- URL
- Última modificação
- Frequência de modificação (None, Always, Hourly, Daily, Weekly, Monthly, Yearly, Never)
- Prioridade (1.00, 0.80, 0.50…)
Agora vamos ver como gerar sitemap com ASP.NET em 2 exemplos, o sitemap.aspx e o sitemap.ashx.
Sitemap.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="sitemap.aspx.cs" Inherits="sitemap2.sitemap" %>
Sitemap.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;
using System.Text;
namespace sitemap2
{
public partial class sitemap : System.Web.UI.Page
{
XmlTextWriter xtw;
protected void Page_Load(object sender, EventArgs e)
{
Response.Clear();
//Esta linha vai fazer com que a página retorne um XML e não mais HTML
Response.ContentType = "text/xml";
//Criar o arquivo em memória usando a codificação UTF8
xtw = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
//A linha abaixo vai identar o código para não ficar em uma linha só.
xtw.Formatting = Formatting.Indented;
//Escreve a declaração do documento <?xml version="1.0" encoding="utf-8"?>
xtw.WriteStartDocument();
//cria o elemento raiz <urlset>
xtw.WriteStartElement("urlset");
//Adiciona o atributo xmlns
xtw.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");
/*Chama a função que vai criar o elemento URL no XML
* com loc = http://www.cbsa.com.br/default.aspx,
* lastmod = Data atual,
* changefreq = always
* e priority = 1.0 */
WriteURLElement("http://www.cbsa.com.br/default.aspx", DateTime.Now, "1.0");
//criar o elemento URL no XML para o item abaixo
WriteURLElement("http://cbsa.com.br/categoria/C%23.aspx", DateTime.Now, "0.8");
//criar o elemento URL no XML para o item abaixo
WriteURLElement("http://www.cbsa.com.br/categoria/asp.net.aspx", DateTime.Now, "0.8");
//libera o XmlTextWriter
xtw.Flush();
//fechar o XmlTextWriter
xtw.Close();
//Termina aqui
Response.End();
}
/// <summary>
/// Cria o elemento URL
/// </summary>
/// <param name="loc">URL</param>
/// <param name="lastmod">Última modificação</param>
/// <param name="priority">Prioridade</param>
public void WriteURLElement(string loc, DateTime lastmod, string priority)
{
//Cria o elemento URL
xtw.WriteStartElement("url");
//Cria o elemento loc
xtw.WriteElementString("loc", loc);
//Cria o elemento lastmod
xtw.WriteElementString("lastmod", lastmod.ToString("yyyy-MM-dd"));
//Cria o elemento changefreq
xtw.WriteElementString("changefreq", "always");
//Cria o elemento priority
xtw.WriteElementString("priority", priority);
//Fecha o elemento URL
xtw.WriteEndElement();
}
}
}
Resultado:
<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.cbsa.com.br/default.aspx</loc>
<lastmod>2012-05-30</lastmod>
<changefreq>always</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>http://cbsa.com.br/categoria/C%23.aspx</loc>
<lastmod>2012-05-30</lastmod>
<changefreq>always</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>http://www.cbsa.com.br/categoria/asp.net.aspx</loc>
<lastmod>2012-05-30</lastmod>
<changefreq>always</changefreq>
<priority>0.8</priority>
</url>
</urlset>
No exemplo abaixo vou criar os itens do sitemap dinamicamente com dados do banco de dados.
Sitemap.ashx
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Xml;
using System.Text;
using System.Data.SqlClient;
namespace sitemap2
{
/// <summary>
/// Summary description for sitemap1
/// </summary>
public class sitemap1 : IHttpHandler
{
XmlTextWriter xtw;
public void ProcessRequest(HttpContext context)
{
context.Response.Clear();
//Esta linha vai fazer com que a página retorne um XML e não mais HTML
context.Response.ContentType = "text/xml";
//URL do site
string sSiteURL = "http://www.cbsa.com.br";
//Criar o arquivo em memória usando a codificação UTF8
xtw = new XmlTextWriter(context.Response.OutputStream, Encoding.UTF8);
//A linha abaixo vai identar o código para não ficar em uma linha só.
xtw.Formatting = Formatting.Indented;
//Escreve a declaração do documento <?xml version="1.0" encoding="utf-8"?>
xtw.WriteStartDocument();
//cria o elemento raiz <urlset>
xtw.WriteStartElement("urlset");
//Adiciona o atributo xmlns
xtw.WriteAttributeString("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9");
/*Chama a função que vai criar o elemento URL no XML
* com loc = http://www.cbsa.com.br/default.aspx,
* lastmod = Data atual,
* changefreq = always
* e priority = 1.0 */
WriteURLElement(sSiteURL + "/default.aspx", DateTime.Now, "1.0");
/*Agora vou criar os itens dinamicamente para os artigos do blog,
todos com a data atual e prioridade 0.8*/
//Criando a conexão
using (SqlConnection Conn = new SqlConnection(ConnectionString))
{
//SQL Query
string sSQL = @"SELECT contentURL FROM Articles";
//Criando o SqlCommand
SqlCommand myCommand = new SqlCommand(sSQL, Conn);
//Abrindo a conexão
Conn.Open();
//SqlDataReader para buscar o resultado
SqlDataReader dr = myCommand.ExecuteReader();
//Lendo dados de cada registro
while (dr.Read())
{
//criar o elemento URL no XML para cada URL do banco de dados
WriteURLElement("http://www.cbsa.com.br/" + Convert.ToString(dr["contentURL"]), DateTime.Now, "0.8");
}
//Fechar conexão
Conn.Close();
}
//libera o XmlTextWriter
xtw.Flush();
//fechar o XmlTextWriter
xtw.Close();
//Termina aqui
context.Response.End();
}
/// <summary>
/// Cria o elemento URL
/// </summary>
/// <param name="loc">URL</param>
/// <param name="lastmod">Última modificação</param>
/// <param name="priority">Prioridade</param>
public void WriteURLElement(string loc, DateTime lastmod, string priority)
{
//Cria o elemento URL
xtw.WriteStartElement("url");
//Cria o elemento loc
xtw.WriteElementString("loc", loc);
//Cria o elemento lastmod
xtw.WriteElementString("lastmod", lastmod.ToString("yyyy-MM-dd"));
//Cria o elemento changefreq
xtw.WriteElementString("changefreq", "always");
//Cria o elemento priority
xtw.WriteElementString("priority", priority);
//Fecha o elemento URL
xtw.WriteEndElement();
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
Download do projeto aqui