← Tutti gli articoli

Asp.Net Generic Handler (ashx) to generate Google Sitemap

20 agosto 2010  · Asp.Net · Article  ·  1237 visite

Asp.Net Generic Handler (ashx) to generate Google Sitemap

<%@ WebHandler Language="C#" Class="SiteMap" %>

using System;
using System.Linq;
using System.Data;
using System.Configuration;
using System.Collections.Generic;
using System.Web;
using System.Xml;
using System.Text;
using System.IO;

using MaragnaNetModel;

    public class SiteMap : IHttpHandler
    {
        private XmlWriter _xmlWriter;
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/xml";
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Encoding = Encoding.UTF8;
            settings.Indent = true;
            _xmlWriter = XmlWriter.Create(context.Response.OutputStream, settings);
            _xmlWriter.WriteStartDocument();
            _xmlWriter.WriteStartElement("urlset", "http://www.google.com/schemas/sitemap/0.9");
            // Add root node
            AddUrl("http://www.maragna.net", DateTime.Now, "weekly", "1.0");
            AddUrl("http://maragna.net/Showcase.aspx", DateTime.Now, "weekly", "1.0");
            AddUrl("http://maragna.net/ContentSearch.aspx", DateTime.Now, "weekly", "1.0");

            // Add all other nodes

            MaragnaNetEntities ctx = new MaragnaNetEntities(ConfigurationManager.ConnectionStrings["MaragnaNetEntities"].ToString());
            var contenuti = from h in ctx.ContentsHistory
                            where h.ContentStatusID == ContentStatus.Published && h.FinishDate == null
                            select new
                                {
                                    h.BeginDate,
                                    //h.Contents.ContentTitle,
                                    //h.Contents.ContentDescription
                                    h.ContentId
                                };
            foreach(var c in contenuti.ToList()){
                AddUrl("http://maragna.net/ContentView.aspx?ContentId=" + c.ContentId.ToString(), c.BeginDate,"monthly","1.0");
            }






            _xmlWriter.WriteEndElement();
            _xmlWriter.WriteEndDocument();

            _xmlWriter.Flush();
        }
        private void AddUrl(string Url, DateTime lastmod, string changefreq, string priority)
        {
            // Skip empty Urls
            if (String.IsNullOrEmpty(Url))
                return;
            // Skip remote nodes

            // Open url tag
            _xmlWriter.WriteStartElement("url");
            // Write location
            _xmlWriter.WriteStartElement("loc");
            _xmlWriter.WriteString(GetFullUrl(Url));
            _xmlWriter.WriteEndElement();
            // Write last modified
            _xmlWriter.WriteStartElement("lastmod");
            _xmlWriter.WriteString(String.Format("{0:yyyy-MM-dd}", lastmod));
            _xmlWriter.WriteEndElement();

            // Write changefreq
            _xmlWriter.WriteStartElement("changefreq");
            _xmlWriter.WriteString(changefreq);
            _xmlWriter.WriteEndElement();

            // Write priority
            _xmlWriter.WriteStartElement("priority");
            _xmlWriter.WriteString(priority);
            _xmlWriter.WriteEndElement();

            // Close url tag
            _xmlWriter.WriteEndElement();
        }
        private string GetFullUrl(string url)
        {
            HttpContext context = HttpContext.Current;
            string server = context.Request.Url.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped);
            return Combine(server, url);
        }
        private string Combine(string baseUrl, string url)
        {
            baseUrl = baseUrl.TrimEnd(new char[] { '/' });
            url = url.TrimStart(new char[] { '/' });
            return baseUrl + "/" + url;
        }
        private string GetLastModified(string url)
        {
            HttpContext context = HttpContext.Current;
            string physicalPath = context.Server.MapPath(url);
            return File.GetLastWriteTimeUtc(physicalPath).ToString("s") + "Z";
        }
        public bool IsReusable
        {
            get { return true; }
        }

    }