using System;
using System.Configuration;
using System.Data.SqlClient;
using System.IO;
using System.Text;
using System.Web;
using System.Web.Services;
using System.Xml;
namespace Dileno
{
/// <summary>
/// Summary description for $codebehindclassname$
/// </summary>
[WebService(Namespace="http://tempuri.org/")]
[WebServiceBinding(ConformsTo=WsiProfiles.BasicProfile1_1)]
public class Rss : IHttpHandler
{
// Settings for RSS feed: site url, site title and feed cache name
private string _siteUrl = "http://blogg.dileno.com/";
private string _siteTitle = "blogg.dileno.com";
private string _feedCacheName = "RssFeedCache";
public void ProcessRequest(HttpContext context)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "text/xml";
Object objFeed = context.Cache.Get(_feedCacheName);
if (objFeed == null) CreateFeedCache();
HttpContext.Current.Response.Write(context.Cache.Get(_feedCacheName).ToString());
HttpContext.Current.Response.End();
}
/// <summary>
/// Adds items to cache
/// </summary>
private void CreateFeedCache()
{
// Use MemoryStream for UTF-8 output
MemoryStream ms
= new MemoryStream
();
StreamWriter objWriter
= new StreamWriter
(ms
);
// Use indenting for easier reading and debugging
XmlWriterSettings settings
= new XmlWriterSettings
();
settings.Indent = true;
// Instance of XML object for RSS feed
XmlWriter objXml = XmlWriter.Create(objWriter, settings);
// Build XML document header
objXml.WriteStartDocument();
objXml.WriteStartElement("rss");
objXml.WriteAttributeString("version", "2.0");
objXml.WriteStartElement("channel");
objXml.WriteElementString("title", _siteTitle);
objXml.WriteElementString("link", _siteUrl);
objXml.WriteElementString("description", "RSS för tio senaste inläggen på " + _siteTitle);
objXml.WriteElementString("copyright", "© Martin Söderlund");
objXml.WriteElementString("ttl", "15");
// Fetch items from database and add to XML feed
string strSQL = "SELECT TOP 10 id,heading,intro,entry,url,dt FROM tblEntries ORDER BY id DESC";
SqlConnection objConn
= new SqlConnection
(ConfigurationManager.
ConnectionStrings["dbEntries"].
ConnectionString);
SqlCommand objCmd
= new SqlCommand
(strSQL, objConn
);
try
{
objConn.Open();
SqlDataReader sdr = objCmd.ExecuteReader();
while (sdr.Read())
{
objXml.WriteStartElement("item");
objXml.WriteStartElement("title");
objXml.WriteCData(sdr.GetValue(1).ToString());
objXml.WriteEndElement();
objXml.WriteElementString("link", _siteUrl + "entry.aspx?id=" + sdr["id"].ToString());
objXml.WriteStartElement("description");
objXml.WriteCData(sdr["intro"].ToString() + sdr["entry"].ToString());
objXml.WriteEndElement();
objXml.WriteElementString("guid", _siteUrl + "entry.aspx?id=" + sdr["id"].ToString());
objXml.WriteElementString("pubDate", Convert.ToDateTime(sdr["dt"]).ToString("R"));
objXml.WriteEndElement();
}
}
catch { }
finally
{
objConn.Close();
}
objXml.WriteEndElement();
objXml.WriteEndElement();
objXml.WriteEndDocument();
objXml.Flush();
objXml.Close();
// Read from MemoryStream
TextReader objReader
= new StreamReader
(ms
);
ms.Seek(0, SeekOrigin.Begin);
string rssFeed = objReader.ReadToEnd();
objReader.Close();
// Cache XML data for 8 hours
HttpContext.Current.Cache.Insert(_feedCacheName, rssFeed, null, DateTime.Now.AddHours(8), TimeSpan.Zero);
}
public bool IsReusable
{
get
{
return false;
}
}
}
}