Início > .NET, asp.net, MVC, SEO, SiteMap, XML > MVC – Sitemap simples e eficiente

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.

Categorias.NET, asp.net, MVC, SEO, SiteMap, XML Tags:, , , ,

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.