MVC – Sitemap simples e eficiente
No blog www.rafaelalmeida.net, postei a pouco tempo sobre sitemaps com o asp.net MVC. Ficou bem bacana então resolvi replicar aqui. Vale lembrar que a solução inicial foi do Joel Abrahamssom e minha solução apresentada abaixo difere apenas em alguns pontos com por exemplo a maneira de criar os itens que vão ser exibidos.
O código é bem simples e intuitivo, caso alguém ainda tenha dúvida deixa um comentário.
namespace RafaelAlmeida.Controllers
{
public class SitemapController : Controller
{
//
// GET: /Sitemap/
public XmlSitemapResult Index()
{
/// Monta o site map
var itens = new SitemapItensCollection();
AddEntries(ref itens);
return new XmlSitemapResult(itens);
}
private void AddEntries(ref SitemapItensCollection itens)
{
/// Identifica os posts que vão para o sitemap
var repository = new Models.BlogRepository();
foreach (var post in repository.getPosts())
{
itens.Add(new SitemapItem(@"http://www.rafaelalmeida.net/post/" + post.name) { ChangeFrequency= ChangeFrequency.Weekly, Priority=1, LastModified = post.date});
}
}
}
}
namespace net.rafaelalmeida.XmlSitemap
{
public class XmlSitemapResult : ActionResult
{
/// Itens
private readonly SitemapItensCollection _items;
/// Construtor
public XmlSitemapResult(SitemapItensCollection items)
{
_items = items;
}
/// Gera o xml com o sitemap
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.ContentType = "application/rss+xml";
context.HttpContext.Response.Flush();
var ser = new XmlSerializer(typeof(SitemapItensCollection));
ser.Serialize(context.HttpContext.Response.Output, _items);
}
}
}
namespace net.rafaelalmeida.XmlSitemap
{
/// Coloca os namespaces
[XmlType(Namespace = "http://www.google.com/schemas/sitemap/0.84", TypeName = "urlset")]
[XmlRootAttribute(Namespace = "http://www.google.com/schemas/sitemap/0.84", ElementName = "urlset", IsNullable = false)]
public class SitemapItensCollection: List<SitemapItem>
{
}
}
namespace net.rafaelalmeida.XmlSitemap
{
[XmlTypeAttribute(TypeName = "url")]
public class SitemapItem : ISitemapItem
{
/// Construtor
public SitemapItem()
{
}
/// Construtor
public SitemapItem(string url)
{
Url = url;
}
/// Url do Post
[XmlElementAttribute( DataType = "anyURI", ElementName= "loc")]
public string Url { get; set; }
/// Data de modificação
[XmlElementAttribute(DataType = "date", ElementName = "lastmod")]
public DateTime? LastModified { get; set; }
/// Frequencia de atualização
[XmlElementAttribute( ElementName = "changefreq")]
public ChangeFrequency? ChangeFrequency { get; set; }
/// Prioridade
[XmlElementAttribute(ElementName = "priority")]
public float? Priority { get; set; }
}
}
namespace net.rafaelalmeida.XmlSitemap
{
/// Tipos de Frequencia
public enum ChangeFrequency
{
Always,
Hourly,
Daily,
Weekly,
Monthly,
Yearly,
Never
}
}
namespace net.rafaelalmeida.XmlSitemap
{
/// Interface de item do sitemap
public interface ISitemapItem
{
/// URL
string Url { get; }
/// Data de modificação
DateTime? LastModified { get; }
/// Frequencia de atualização
ChangeFrequency? ChangeFrequency { get; }
/// Prioridade
float? Priority { get; }
}
}
Um exemplo dele funcionando é o sitemap do meu blog pessoal http://rafaelalmeida.net/sitemap/index.