<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>ASP.NET</title>
        <link>http://blogs.interakting.co.uk/steve/category/51.aspx</link>
        <description>Microsoft ASP.NET web technologies</description>
        <language>en-GB</language>
        <copyright>Stephen Horsfield</copyright>
        <managingEditor>stephen.horsfield@interakting.co.uk</managingEditor>
        <generator>Subtext Version 1.9.5.177</generator>
        <item>
            <title>WCF and EPiServer: Using WCF Web Programming Model Services in EPiServer sites on IIS 7</title>
            <link>http://blogs.interakting.co.uk/steve/archive/2008/11/20/wcf-and-episerver-using-wcf-web-programming-model-services-in.aspx</link>
            <description>&lt;p&gt;I've just managed to get the &lt;a title="Microsoft .NET Framework" target="_blank" href="http://msdn2.microsoft.com/en-gb/netframework/default.aspx"&gt;.NET&lt;/a&gt; 3.5 style of WCF Web Programming Model services to work inside an &lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt; 5 R2 site on IIS 7 and Windows 2008.  I had a few difficulties finding out how to integrate the new model into IIS/ASP.NET and then further problems getting it working in EPiServer.  Here, I outline the solution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I'm currently designing a site that will be using the Akamai Edge Suite of technologies (&lt;a href="http://www.akamai.com"&gt;www.akamai.com&lt;/a&gt;) and so I desire that all client access is through the caching layer.  Additionally, I'm motivated towards a REST model for web services to support a greater degree of caching.&lt;/p&gt;
&lt;p&gt;The new WCF Web Programming Model is ideal for this purpose as I can wrap service parameters directly into the URL and reduce the coding effort considerably.  I had been concerned about the integration of services into the same website as EPiServer because of how the URL mapping works in the Web Programming Model.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The solution is really easy once you realise that the typical EPiServer installation changes the default ASP.NET configuration.  Specifically, you may need the following:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Create a new folder to host your services &lt;/li&gt;
    &lt;li&gt;Create a small web.config in this folder (or use location tags in the main web.config file) and add service handlers &lt;/li&gt;
    &lt;li&gt;Create a ".svc" file for the service &lt;/li&gt;
    &lt;li&gt;Create the supporting .NET service code &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;u&gt;Create a new folder to host your services&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;This is necessary to allow a separate application configuration.  You can change the main application configuration at your own risk, however :)&lt;/p&gt;
&lt;p&gt;For the purposes of this post, I'll use "~/services/".&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Create a small web.config for this folder and add service handlers&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;You'll need to add the following:&lt;/p&gt;
&lt;div&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;="UTF-8"&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.webServer&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;handlers&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="svc-ISAPI"&lt;/span&gt; &lt;span class="attr"&gt;path&lt;/span&gt;&lt;span class="kwrd"&gt;="*.svc"&lt;/span&gt; &lt;span class="attr"&gt;verb&lt;/span&gt;&lt;span class="kwrd"&gt;="*"&lt;/span&gt; &lt;span class="attr"&gt;modules&lt;/span&gt;&lt;span class="kwrd"&gt;="IsapiModule"&lt;/span&gt; 
           &lt;span class="attr"&gt;scriptProcessor&lt;/span&gt;&lt;span class="kwrd"&gt;="%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll"&lt;/span&gt;
           &lt;span class="attr"&gt;resourceType&lt;/span&gt;&lt;span class="kwrd"&gt;="Unspecified"&lt;/span&gt; 
           &lt;span class="attr"&gt;preCondition&lt;/span&gt;&lt;span class="kwrd"&gt;="classicMode,runtimeVersionv2.0,bitness32"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="ServiceHost"&lt;/span&gt; &lt;span class="attr"&gt;path&lt;/span&gt;&lt;span class="kwrd"&gt;="*.svc"&lt;/span&gt; &lt;span class="attr"&gt;verb&lt;/span&gt;&lt;span class="kwrd"&gt;="*"&lt;/span&gt;
           &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="System.ServiceModel.Activation.HttpHandler, System.ServiceModel,
                 Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"&lt;/span&gt;
           &lt;span class="attr"&gt;resourceType&lt;/span&gt;&lt;span class="kwrd"&gt;="Unspecified"&lt;/span&gt; &lt;span class="attr"&gt;preCondition&lt;/span&gt;&lt;span class="kwrd"&gt;="integratedMode"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;handlers&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;system.webServer&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;configuration&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Now I took this from a cleanly created website with no configuration (using the IIS management console) and I recommend that you do the same.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Create a ".svc" file for the service&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;This file is created in the service folder and forms part of the URL so name it accordingly.  I'll just use "service.svc" for illustration:&lt;/p&gt;
&lt;div&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="asp"&gt;&amp;lt;%@ ServiceHost Language="C#" Service="Service" CodeBehind="~/App_Code/service.cs"
    Factory="System.ServiceModel.Activation.WebServiceHostFactory" %&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;You should name your services more appropriately, of course.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Create the supporting .NET service code&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;So, you need to create the classes.  Here, I'm using a simple file in the App_Code folder, but you might prefer to use a separate code project and assembly.  Here's a simple example:&lt;/p&gt;
&lt;div&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ServiceModel;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ServiceModel.Web;

[ServiceContract]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IService
{
  [OperationContract]
  [WebGet(UriTemplate = &lt;span class="str"&gt;"test?s={s}"&lt;/span&gt;)]
  &lt;span class="kwrd"&gt;string&lt;/span&gt; test(&lt;span class="kwrd"&gt;string&lt;/span&gt; s);
}

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Service : IService
{
  &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; test(&lt;span class="kwrd"&gt;string&lt;/span&gt; s)
  {
    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;"test: "&lt;/span&gt; + s;
  }
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;So, this is a very basic service with a single HTTP GET method that returns some data dependent on a single query string parameter.  A perfect REST example as the result is defined by the input, there is no change of state (so two identical GET requests result in the same value) and so the response is suitable for caching.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Using the service&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;So now, you can access the service as &lt;em&gt;http://your_episerver_site/services/service.svc/test?s=YourTestString&lt;/em&gt;.  ASP.NET integration (and IIS) requires the use of a service extension, in this case ".svc", however this article may help you to remove this issue: &lt;a title="http://blogs.msdn.com/bags/archive/2008/08/22/rest-in-wcf-part-ix-controlling-the-uri.aspx" href="http://blogs.msdn.com/bags/archive/2008/08/22/rest-in-wcf-part-ix-controlling-the-uri.aspx"&gt;http://blogs.msdn.com/bags/archive/2008/08/22/rest-in-wcf-part-ix-controlling-the-uri.aspx&lt;/a&gt; but don't forget that EPiServer already does some URL rewriting and so you'll have to make sure they don't conflict!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Metadata&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Categories: ASP.NET, EPiServer, SOA, WCF, .NET, Windows Server &lt;/li&gt;
    &lt;li&gt;Keywords: Web Programming Model, Windows Communication Foundation, Service Oriented Architecture, AJAX, JSON &lt;/li&gt;
    &lt;li&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/software%20development"&gt;software development&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/Windows%20Communication%20Foundation"&gt;Windows Communication Foundation&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/.NET"&gt;.NET&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/JSON"&gt;JSON&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/WCF"&gt;WCF&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/SOA"&gt;SOA&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/service%20design"&gt;service design&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/Service%20Oriented%20Architecture"&gt;Service Oriented Architecture&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/EPiServer"&gt;EPiServer&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/ASP.NET"&gt;ASP.NET&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/AJAX"&gt;AJAX&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://blogs.interakting.co.uk/steve/aggbug/366.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stephen Horsfield</dc:creator>
            <guid>http://blogs.interakting.co.uk/steve/archive/2008/11/20/wcf-and-episerver-using-wcf-web-programming-model-services-in.aspx</guid>
            <pubDate>Thu, 20 Nov 2008 17:10:58 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/steve/comments/366.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/steve/archive/2008/11/20/wcf-and-episerver-using-wcf-web-programming-model-services-in.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/steve/comments/commentRss/366.aspx</wfw:commentRss>
        </item>
        <item>
            <title>SubText: Supporting additional feeds (category, month, day)</title>
            <link>http://blogs.interakting.co.uk/steve/archive/2008/05/06/SubText--Supporting-additional-feeds.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Some of you might have recognised that we are using a customised version of the SubText blogging engine for these blogs.  Recently, I've made some changes to support additional feeds and I thought I'd share them with you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Goals&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We wanted to support context-specific feeds throughout the blog site.  Since we host multiple blogs in the same site, this meant that we had the following requirements:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Enable access to the aggregated RSS feed throughout the site &lt;/li&gt;
    &lt;li&gt;Enable access to the main blog feed in both Atom and Rss formats &lt;/li&gt;
    &lt;li&gt;Enable access to category, day and month feeds from relevant pages &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To address this issue, I found the following:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;The existing Rss.aspx and Atom.aspx pages already supported blog-specific RSS and Atom feeds, but the atom link wasn't being created correctly &lt;/li&gt;
    &lt;li&gt;The existing MainFeed.aspx page supported an aggregated RSS feed but wasn't available as a link throughout the site &lt;/li&gt;
    &lt;li&gt;A handler existed to support an RSS category-specific feed, but not for day/month archives &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My solution comprised two main parts:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;A new &lt;a title="Microsoft ASP.NET" target="_blank" href="http://msdn2.microsoft.com/en-gb/asp.net/default.aspx"&gt;ASP.NET&lt;/a&gt; user control to implement context-specific feed links on all pages &lt;/li&gt;
    &lt;li&gt;A new ASP.NET handler to implement a day-specific and month-specific RSS feed &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Part 1: Context-specific feed links&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The existing pages already linked to feeds, but these weren't correctly configured.  Instead of changing them, I replaced them with a single ASP.NET user control to make it easier to manage.  This control had the following markup:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;link&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="HeaderFeedLinks_Atom"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="application/atom+xml"&lt;/span&gt; 
    &lt;span class="attr"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;="Blog (Atom)"&lt;/span&gt; &lt;span class="attr"&gt;rel&lt;/span&gt;&lt;span class="kwrd"&gt;="alternate"&lt;/span&gt; &lt;span class="attr"&gt;visible&lt;/span&gt;&lt;span class="kwrd"&gt;="false"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;link&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="HeaderFeedLinks_RSS"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="application/rss+xml"&lt;/span&gt; 
    &lt;span class="attr"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;="Blog (Rss)"&lt;/span&gt; &lt;span class="attr"&gt;rel&lt;/span&gt;&lt;span class="kwrd"&gt;="alternate"&lt;/span&gt; &lt;span class="attr"&gt;visible&lt;/span&gt;&lt;span class="kwrd"&gt;="false"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;link&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="HeaderFeedLinks_Agg"&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;="/MainFeed.aspx"&lt;/span&gt;
    &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="application/rss+xml"&lt;/span&gt; &lt;span class="attr"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;="Aggregated Feed (RSS)"&lt;/span&gt;
    &lt;span class="attr"&gt;rel&lt;/span&gt;&lt;span class="kwrd"&gt;="alternate"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;link&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;="server"&lt;/span&gt; &lt;span class="attr"&gt;id&lt;/span&gt;&lt;span class="kwrd"&gt;="HeaderFeedLinks_LocalRSS"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="application/rss+xml"&lt;/span&gt;
    &lt;span class="attr"&gt;title&lt;/span&gt;&lt;span class="kwrd"&gt;="Viewed Content (Rss)"&lt;/span&gt; &lt;span class="attr"&gt;rel&lt;/span&gt;&lt;span class="kwrd"&gt;="alternate"&lt;/span&gt; &lt;span class="attr"&gt;visible&lt;/span&gt;&lt;span class="kwrd"&gt;="false"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;As you can see, there isn't much special here except that the links aren't specified in most cases and also that most of the links are not visible by default.&lt;/p&gt;
&lt;p&gt;The code-behind for the control determines which links to display and configures them appropriately:&lt;/p&gt;
&lt;div&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Configuration;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Security;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.WebControls;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.WebControls.WebParts;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.UI.HtmlControls;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Subtext.Web.UI.Pages;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Subtext.Web.UI.Controls;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Subtext.Framework;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text.RegularExpressions;

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; HeaderFeedLinks : Subtext.Web.UI.Controls.BaseControl
{

    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Page_Load(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)
    {
        &lt;span class="kwrd"&gt;string&lt;/span&gt; path = Request.Url.AbsolutePath;
        
        &lt;span class="rem"&gt;/* Looking for different cases as follows&lt;/span&gt;
&lt;span class="rem"&gt;         * &lt;/span&gt;
&lt;span class="rem"&gt;         * 1. Site root pages - aggregated feed only&lt;/span&gt;
&lt;span class="rem"&gt;         * 2. Blog root pages - complete individual feeds&lt;/span&gt;
&lt;span class="rem"&gt;         * 2. Category pages - category specific feeds&lt;/span&gt;
&lt;span class="rem"&gt;         * 3. Archive summary pages - year, month, day feeds&lt;/span&gt;
&lt;span class="rem"&gt;         * 4. Individual posts - complete individual feeds&lt;/span&gt;
&lt;span class="rem"&gt;         * &lt;/span&gt;
&lt;span class="rem"&gt;         */&lt;/span&gt;

        HeaderFeedLinks_Agg.Attributes[&lt;span class="str"&gt;"href"&lt;/span&gt;] = 
            HttpContext.Current.Request.ApplicationPath + &lt;span class="str"&gt;"MainFeed.aspx"&lt;/span&gt;;
        
        BlogInfo bi = &lt;span class="kwrd"&gt;this&lt;/span&gt;.CurrentBlog;

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (bi == &lt;span class="kwrd"&gt;null&lt;/span&gt;) &lt;span class="kwrd"&gt;return&lt;/span&gt;; &lt;span class="rem"&gt;// only show the aggregated feed&lt;/span&gt;

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (bi.RootUrl.AbsolutePath == HttpContext.Current.Request.ApplicationPath)
        {
            &lt;span class="kwrd"&gt;return&lt;/span&gt;; &lt;span class="rem"&gt;// only show the aggregated feed&lt;/span&gt;
        }
        &lt;span class="kwrd"&gt;string&lt;/span&gt; baseUrl = bi.RootUrl.AbsolutePath;
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!path.StartsWith(baseUrl)) &lt;span class="kwrd"&gt;return&lt;/span&gt;; &lt;span class="rem"&gt;// unusual path&lt;/span&gt;
        &lt;span class="kwrd"&gt;string&lt;/span&gt; relPath = path.Substring(baseUrl.Length);
        &lt;span class="kwrd"&gt;string&lt;/span&gt; feedPath = String.Empty;
        &lt;span class="kwrd"&gt;bool&lt;/span&gt; hasLocal = &lt;span class="kwrd"&gt;false&lt;/span&gt;;

        &lt;span class="kwrd"&gt;if&lt;/span&gt; (bi.FeedBurnerEnabled &amp;amp;&amp;amp; (!String.IsNullOrEmpty(bi.FeedBurnerName)))
        {
            HeaderFeedLinks_RSS.Visible = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            HeaderFeedLinks_Atom.Visible = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            HeaderFeedLinks_RSS.Attributes[&lt;span class="str"&gt;"href"&lt;/span&gt;] = &lt;br /&gt;              &lt;span class="str"&gt;"http://feeds.feedburner.com/"&lt;/span&gt; + bi.FeedBurnerName;
            HeaderFeedLinks_Atom.Attributes[&lt;span class="str"&gt;"href"&lt;/span&gt;] = &lt;br /&gt;          &lt;span class="str"&gt;"http://feeds.feedburner.com/"&lt;/span&gt; + bi.FeedBurnerName;
        }
        &lt;span class="kwrd"&gt;else&lt;/span&gt;
        {
            HeaderFeedLinks_RSS.Visible = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            HeaderFeedLinks_Atom.Visible = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            HeaderFeedLinks_RSS.Attributes[&lt;span class="str"&gt;"href"&lt;/span&gt;] = baseUrl + &lt;span class="str"&gt;"rss.aspx"&lt;/span&gt;;
            HeaderFeedLinks_Atom.Attributes[&lt;span class="str"&gt;"href"&lt;/span&gt;] = baseUrl + &lt;span class="str"&gt;"atom.aspx"&lt;/span&gt;;
        }
        
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (relPath.Length &amp;gt; 0)
        {
            &lt;span class="kwrd"&gt;string&lt;/span&gt; ptYear = &lt;span class="str"&gt;@"([0-9]{4})"&lt;/span&gt;;
            &lt;span class="kwrd"&gt;string&lt;/span&gt; ptMonth = &lt;span class="str"&gt;@"([0-9]{2})"&lt;/span&gt;;
            &lt;span class="kwrd"&gt;string&lt;/span&gt; ptDay = &lt;span class="str"&gt;@"([0-9]{2})"&lt;/span&gt;;
            &lt;span class="kwrd"&gt;string&lt;/span&gt; ptFileAndQuery = &lt;span class="str"&gt;@"([^?/]+)\.aspx($|\?.*$)"&lt;/span&gt;;
            &lt;span class="kwrd"&gt;string&lt;/span&gt; ptCat = &lt;span class="str"&gt;@"^category"&lt;/span&gt;;
            &lt;span class="kwrd"&gt;string&lt;/span&gt; ptArchive = &lt;span class="str"&gt;@"^archive"&lt;/span&gt;;

            &lt;span class="rem"&gt;// cases: category, post, day, month, year&lt;/span&gt;

            &lt;span class="kwrd"&gt;string&lt;/span&gt; patCategory = ptCat + &lt;span class="str"&gt;"/"&lt;/span&gt; + ptFileAndQuery;
            &lt;span class="kwrd"&gt;string&lt;/span&gt; patYear = ptArchive + &lt;span class="str"&gt;"/"&lt;/span&gt; + ptFileAndQuery;
            &lt;span class="kwrd"&gt;string&lt;/span&gt; patMonth = ptArchive + &lt;span class="str"&gt;"/"&lt;/span&gt; + ptYear + &lt;span class="str"&gt;"/"&lt;/span&gt; + ptFileAndQuery;
            &lt;span class="kwrd"&gt;string&lt;/span&gt; patDay = ptArchive + &lt;span class="str"&gt;"/"&lt;/span&gt; + ptYear + &lt;span class="str"&gt;"/"&lt;/span&gt; + ptMonth + &lt;span class="str"&gt;"/"&lt;/span&gt; &lt;br /&gt;                          + ptFileAndQuery; &lt;span class="rem"&gt;// -&amp;gt; archive/(1)/(2)/(3)/feed.aspx&lt;/span&gt;
            &lt;span class="kwrd"&gt;string&lt;/span&gt; patPost = ptArchive + &lt;span class="str"&gt;"/"&lt;/span&gt; + ptYear + &lt;span class="str"&gt;"/"&lt;/span&gt; + ptMonth + &lt;span class="str"&gt;"/"&lt;/span&gt; &lt;br /&gt;                           + ptDay + &lt;span class="str"&gt;"/"&lt;/span&gt; + ptFileAndQuery;

            Regex reCat = &lt;span class="kwrd"&gt;new&lt;/span&gt; Regex(patCategory, RegexOptions.IgnoreCase);
            Regex reYear = &lt;span class="kwrd"&gt;new&lt;/span&gt; Regex(patYear, RegexOptions.IgnoreCase);
            Regex reMonth = &lt;span class="kwrd"&gt;new&lt;/span&gt; Regex(patMonth, RegexOptions.IgnoreCase);
            Regex reDay = &lt;span class="kwrd"&gt;new&lt;/span&gt; Regex(patDay, RegexOptions.IgnoreCase);
            Regex rePost = &lt;span class="kwrd"&gt;new&lt;/span&gt; Regex(patPost, RegexOptions.IgnoreCase);

            &lt;span class="kwrd"&gt;if&lt;/span&gt; (rePost.IsMatch(relPath))
            {
                feedPath = String.Empty;
            }
            &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (reCat.IsMatch(relPath))
            {
                feedPath = reCat.Replace(relPath, &lt;span class="str"&gt;"category/$1.aspx/rss"&lt;/span&gt;);
                hasLocal = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (reYear.IsMatch(relPath)) &lt;span class="rem"&gt;// not supported by SubText&lt;/span&gt;
            {
                feedPath = reYear.Replace(relPath, &lt;span class="str"&gt;"archive/$1/"&lt;/span&gt;);
            }
            &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (reMonth.IsMatch(relPath))
            {
                feedPath = reMonth.Replace(relPath, &lt;span class="str"&gt;"archive/$1/$2.aspx/rss"&lt;/span&gt;);
                hasLocal = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (reDay.IsMatch(relPath))
            {
                feedPath = reDay.Replace(relPath, &lt;span class="str"&gt;"archive/$1/$2/$3.aspx/rss"&lt;/span&gt;);
                hasLocal = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            }
            &lt;span class="kwrd"&gt;else&lt;/span&gt;
            {
                feedPath = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Empty;
            }
        }
        &lt;span class="kwrd"&gt;if&lt;/span&gt; (hasLocal)
        {
            &lt;span class="kwrd"&gt;string&lt;/span&gt; absFeedPath = baseUrl + feedPath;

            &lt;span class="kwrd"&gt;this&lt;/span&gt;.HeaderFeedLinks_LocalRSS.Attributes[&lt;span class="str"&gt;"href"&lt;/span&gt;] = absFeedPath;
            &lt;span class="kwrd"&gt;this&lt;/span&gt;.HeaderFeedLinks_LocalRSS.Visible = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
        }
    }
}&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This control needs to be placed in the DTP.aspx and Default.aspx pages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Part 2: Day-specific and month-specific RSS feeds&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In order to support this, I needed to create a separate class library that included a handler for this output.  Having downloaded the source for SubText, I decided to create a modified copy of the Subtext.Framework.Syndication.RssHandler class.  The complete code is listed below:&lt;/p&gt;
&lt;div&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="preproc"&gt;#region&lt;/span&gt; Disclaimer/Info
&lt;span class="rem"&gt;///////////////////////////////////////////////////////////////////////////////&lt;/span&gt;
&lt;span class="rem"&gt;// Subtext WebLog&lt;/span&gt;
&lt;span class="rem"&gt;// &lt;/span&gt;
&lt;span class="rem"&gt;// Subtext is an open source weblog system that is a fork of the .TEXT&lt;/span&gt;
&lt;span class="rem"&gt;// weblog system.&lt;/span&gt;
&lt;span class="rem"&gt;//&lt;/span&gt;
&lt;span class="rem"&gt;// For updated news and information please visit http://subtextproject.com/&lt;/span&gt;
&lt;span class="rem"&gt;// Subtext is hosted at SourceForge at http://sourceforge.net/projects/subtext&lt;/span&gt;
&lt;span class="rem"&gt;// The development mailing list is at subtext-devs@lists.sourceforge.net &lt;/span&gt;
&lt;span class="rem"&gt;//&lt;/span&gt;
&lt;span class="rem"&gt;// This project is licensed under the BSD license.  See the License.txt file &lt;/span&gt;
&lt;span class="rem"&gt;// for more information.&lt;/span&gt;
&lt;span class="rem"&gt;///////////////////////////////////////////////////////////////////////////////&lt;/span&gt;
&lt;span class="preproc"&gt;#endregion&lt;/span&gt;

&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Subtext.Framework.Data;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Subtext.Framework;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Subtext.Framework.Components;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Subtext.Framework.Syndication;
&lt;span class="kwrd"&gt;using&lt;/span&gt; Subtext.Framework.Util;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text.RegularExpressions;


&lt;span class="kwrd"&gt;namespace&lt;/span&gt; Subtext.Framework.Syndication
{
    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Class used to handle requests for an RSS feed.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; RssMonthHandler : 
      Subtext.Framework.Syndication.BaseSyndicationHandler&amp;lt;Entry&amp;gt;
    {
        BaseSyndicationWriter&amp;lt;Entry&amp;gt; writer;

        &lt;span class="preproc"&gt;#region&lt;/span&gt;  DayMonth support
        DateTime _MonthDay = DateTime.MinValue; 

        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; _isMonth; &lt;span class="rem"&gt;// only set after Month is accessed&lt;/span&gt;
        &lt;span class="kwrd"&gt;protected&lt;/span&gt; DateTime MonthDay
        {
          get
          {
              &lt;span class="kwrd"&gt;if&lt;/span&gt; (_MonthDay != DateTime.MinValue) &lt;span class="kwrd"&gt;return&lt;/span&gt; _MonthDay;

              &lt;span class="kwrd"&gt;string&lt;/span&gt; ptYear = &lt;span class="str"&gt;@"([0-9]{4})"&lt;/span&gt;;
              &lt;span class="kwrd"&gt;string&lt;/span&gt; ptMonth = &lt;span class="str"&gt;@"([0-9]{2})"&lt;/span&gt;;
              &lt;span class="kwrd"&gt;string&lt;/span&gt; ptFileAndQuery = &lt;span class="str"&gt;@"([^?/]+)\.aspx/rss($|\?.*$)"&lt;/span&gt;;
              &lt;span class="kwrd"&gt;string&lt;/span&gt; ptArchive = &lt;span class="str"&gt;@"^archive"&lt;/span&gt;;

              &lt;span class="kwrd"&gt;string&lt;/span&gt; patMonth = ptArchive + &lt;span class="str"&gt;"/"&lt;/span&gt; + ptYear + &lt;span class="str"&gt;"/"&lt;/span&gt; + ptFileAndQuery;
              &lt;span class="kwrd"&gt;string&lt;/span&gt; patDay = ptArchive + &lt;span class="str"&gt;"/"&lt;/span&gt; + ptYear + &lt;span class="str"&gt;"/"&lt;/span&gt; + ptMonth + &lt;span class="str"&gt;"/"&lt;/span&gt; +
                ptFileAndQuery; 

              Regex reMonth = &lt;span class="kwrd"&gt;new&lt;/span&gt; Regex(patMonth, RegexOptions.IgnoreCase);
              Regex reDay = &lt;span class="kwrd"&gt;new&lt;/span&gt; Regex(patDay, RegexOptions.IgnoreCase);

              &lt;span class="kwrd"&gt;string&lt;/span&gt; blogRoot = &lt;span class="kwrd"&gt;this&lt;/span&gt;.CurrentBlog.RootUrl.AbsolutePath;
              &lt;span class="kwrd"&gt;string&lt;/span&gt; reqPath = &lt;span class="kwrd"&gt;this&lt;/span&gt;.Context.Request.Url.AbsolutePath;
              &lt;span class="kwrd"&gt;string&lt;/span&gt; relPath = reqPath.Substring(blogRoot.Length);

              &lt;span class="kwrd"&gt;if&lt;/span&gt; (reDay.IsMatch(relPath))
              {
                Match match = reDay.Match(relPath);
                _isMonth = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
                _MonthDay = &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(
                    &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(match.Groups[1].Value),
                    &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(match.Groups[2].Value),
                    &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(match.Groups[3].Value));
              }
              &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (reMonth.IsMatch(relPath))
              {
                Match match = reMonth.Match(relPath);
                _isMonth = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
                _MonthDay = &lt;span class="kwrd"&gt;new&lt;/span&gt; DateTime(
                    &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(match.Groups[1].Value),
                    &lt;span class="kwrd"&gt;int&lt;/span&gt;.Parse(match.Groups[2].Value),
                    1);
              }
              &lt;span class="kwrd"&gt;else&lt;/span&gt;
              {
                _MonthDay = DateTime.Today;
                _isMonth = &lt;span class="kwrd"&gt;true&lt;/span&gt;; &lt;span class="rem"&gt;// present the current month's posts&lt;/span&gt;
              }
              &lt;span class="kwrd"&gt;return&lt;/span&gt; _MonthDay;
          }
        }
        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Returns the key used to cache this feed.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name="dateLastViewedFeedItemPublished"&amp;gt;Date last viewed feed&lt;/span&gt;
        &lt;span class="rem"&gt;/// item published.&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; CacheKey(DateTime dateLastViewedFeedItemPublished)
        {
            &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; key = 
              &lt;span class="str"&gt;"RSS;IndividualArchiveFeed;BlogId:{0};LastViewed:{1};"&lt;/span&gt; + 
              &lt;span class="str"&gt;"Year:{2};Month:{3};Day:{4}"&lt;/span&gt;;
            DateTime monthday = &lt;span class="kwrd"&gt;this&lt;/span&gt;.MonthDay;

            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(key, CurrentBlog.Id, 
                dateLastViewedFeedItemPublished,
                monthday.Year, monthday.Month ,
                _isMonth ? &lt;span class="str"&gt;"ALL"&lt;/span&gt; : monthday.Day.ToString());
        }

        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Caches the specified RSS feed.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name="feed"&amp;gt;Feed.&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Cache(CachedFeed feed)
        {
            Context.Cache.Insert(CacheKey(
                &lt;span class="kwrd"&gt;this&lt;/span&gt;.SyndicationWriter.DateLastViewedFeedItemPublished), 
                feed, &lt;span class="kwrd"&gt;null&lt;/span&gt;, DateTime.Now.AddSeconds((&lt;span class="kwrd"&gt;double&lt;/span&gt;)CacheDuration.Medium), 
                TimeSpan.Zero);
        }

        &lt;span class="kwrd"&gt;protected&lt;/span&gt; DateTime GetLatestPostStamp(IList&amp;lt;Entry&amp;gt; posts)
        {
            DateTime stamp = DateTime.MinValue;
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Entry e &lt;span class="kwrd"&gt;in&lt;/span&gt; posts)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (e.DateCreated &amp;gt; stamp) stamp = e.DateCreated;
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; stamp;
        }


        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Gets the syndication writer.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; BaseSyndicationWriter&amp;lt;Entry&amp;gt; SyndicationWriter
        {
            get
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (writer == &lt;span class="kwrd"&gt;null&lt;/span&gt;)
                {
                    
                    DateTime monthday = &lt;span class="kwrd"&gt;this&lt;/span&gt;.MonthDay;
                    IList&amp;lt;Entry&amp;gt; posts = _isMonth ?
                        Entries.GetPostCollectionByMonth(
                            monthday.Month, monthday.Year) :
                        Entries.GetSingleDay(monthday);
                    DateTime stamp = GetLatestPostStamp(posts);

                    writer = &lt;span class="kwrd"&gt;new&lt;/span&gt; RssWriter(posts, stamp, &lt;span class="kwrd"&gt;this&lt;/span&gt;.UseDeltaEncoding);
                }
                &lt;span class="kwrd"&gt;return&lt;/span&gt; writer;
            }
        }

        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Returns true if the feed is the main feed.  &lt;/span&gt;
        &lt;span class="rem"&gt;/// False for category feeds and comment feeds.&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsMainfeed
        {
            get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;; }
        }
    }
}&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;All that remains is to link the handler into the web.config:&lt;/p&gt;
&lt;div&gt;
&lt;pre class="csharpcode"&gt;&amp;lt;HttpHandler pattern=&lt;span class="str"&gt;"(?:/archive/\d{4}/\d{2}.aspx/rss)$"&lt;/span&gt; 
  type=&lt;span class="str"&gt;"Subtext.Framework.Syndication.RssMonthHandler, HandlerDll"&lt;/span&gt; 
  handlerType=&lt;span class="str"&gt;"Direct"&lt;/span&gt; /&amp;gt;
&amp;lt;HttpHandler pattern=&lt;span class="str"&gt;"(?:/archive/\d{4}/\d{2}/\d{2}.aspx/rss)$"&lt;/span&gt;
  type=&lt;span class="str"&gt;"Subtext.Framework.Syndication.RssMonthHandler, HandlerDll"&lt;/span&gt; 
  handlerType=&lt;span class="str"&gt;"Direct"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Note that these handlers go into the SubText configuration, not the standard ASP.NET handler configuration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Versions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a title="http://subtextproject.com/" target="_blank" rel="nofollow" href="http://subtextproject.com/"&gt;SubText 1.9.4.78&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Metadata&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Categories: SubText, blogging, Software Development, ASP.NET, .NET &lt;/li&gt;
    &lt;li&gt;Additional keywords: SubText API, RSS, Atom &lt;/li&gt;
    &lt;li&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/ASP.NET"&gt;ASP.NET&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/.NET"&gt;.NET&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/software%20development"&gt;software development&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/SubText"&gt;SubText&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/SubText%20API"&gt;SubText API&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/blogging"&gt;blogging&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://blogs.interakting.co.uk/steve/aggbug/269.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stephen Horsfield</dc:creator>
            <guid>http://blogs.interakting.co.uk/steve/archive/2008/05/06/SubText--Supporting-additional-feeds.aspx</guid>
            <pubDate>Tue, 06 May 2008 12:47:03 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/steve/comments/269.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/steve/archive/2008/05/06/SubText--Supporting-additional-feeds.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/steve/comments/commentRss/269.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Visual Studio: Viewing the .NET framework source code in VS 2008</title>
            <link>http://blogs.interakting.co.uk/steve/archive/2008/04/29/Visual-Studio-Viewing-the-.NET-framework-source-code-in-VS.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Microsoft have released significant parts of the &lt;a title="Microsoft .NET Framework" target="_blank" href="http://msdn2.microsoft.com/en-gb/netframework/default.aspx"&gt;.NET&lt;/a&gt; framework source code for developers using &lt;a title="Microsoft Visual Studio" target="_blank" href="http://msdn2.microsoft.com/en-gb/vstudio/default.aspx"&gt;Visual Studio&lt;/a&gt; 2008.  In case you've not been following the releases, this blog post includes links to configuration and hotfix resources.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hotfix&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before you attempt to configure the source code, make sure you have the following patch installed:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=10443&amp;amp;wa=wsignin1.0"&gt;https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=10443&amp;amp;wa=wsignin1.0&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Configuration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I'll not attempt to reproduce perfectly good instructions, so here's a link:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a title="http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx" target="_blank" href="http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx"&gt;Shawn Burke's Blog: Configuring Visual Studio to Debug .NET Framework Source Code&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Also referenced:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a title="http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx" target="_blank" href="http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx"&gt;ScottGu's Blog: .NET Framework Library Source Code now available&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Versions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;.NET Framework 2.0 and later &lt;/li&gt;
    &lt;li&gt;Visual Studio 2008 (excluding Express editions) &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Metadata&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Categories: .NET, Software Development, Visual Studio &lt;/li&gt;
    &lt;li&gt;Additional keywords: source code &lt;/li&gt;
    &lt;li&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/.NET"&gt;.NET&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/ASP.NET"&gt;ASP.NET&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/software%20development"&gt;software development&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/source%20code"&gt;source code&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/debugging"&gt;debugging&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tags/Visual%20Studio"&gt;Visual Studio&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://blogs.interakting.co.uk/steve/aggbug/265.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stephen Horsfield</dc:creator>
            <guid>http://blogs.interakting.co.uk/steve/archive/2008/04/29/Visual-Studio-Viewing-the-.NET-framework-source-code-in-VS.aspx</guid>
            <pubDate>Tue, 29 Apr 2008 08:23:19 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/steve/comments/265.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/steve/archive/2008/04/29/Visual-Studio-Viewing-the-.NET-framework-source-code-in-VS.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/steve/comments/commentRss/265.aspx</wfw:commentRss>
        </item>
        <item>
            <title>ASP.NET: Integrating Windows Workflow Foundation and marshalling controls</title>
            <link>http://blogs.interakting.co.uk/steve/archive/2008/04/18/ASP.NET-Integrating-Windows-Workflow-Foundation-and-marshalling-controls.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I've been playing around a bit with the idea of integrating Windows Workflow Foundation into custom web server controls.  I've had some success but also hit something of a wall.  If you have any experience with any of these issues, I'd love to hear from you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I've started with the following hypothesis:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;In my experience, developers often make mistakes developing custom controls therefore it is beneficial for controls to be modelled rather than 'coded' and Windows Workflow Foundation is a perfect tool for the job.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In practice&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using a workflow to take the place of aspects of the code is straightforward.  I started by providing multiple workflows, each run synchronously to handle a distinct control event.  This worked well, but suffered in that each workflow was separated and the code ran synchronously.  I desired a better solution.&lt;/p&gt;
&lt;p&gt;Next, I updated the code to use the default scheduling service, redeveloped the server control to use a single workflow and created a communication service to handle event passing to the workflow.  I also added a HandleExternalEvent activity to the workflow to catch the event.&lt;/p&gt;
&lt;p&gt;All looked good, until I threw the event.  The event attempted to pass the web server control to the workflow but the control was not marked as Serializable and was also not derived from MarshallByRefObject.  This meant that the event could not be raised and ultimately killed this solution.&lt;/p&gt;
&lt;p&gt;I'm a bit surprised that you can't marshall web controls across process boundaries.  This has implications for interactions with any separated service, not just WWF.&lt;/p&gt;
&lt;p&gt;Has anyone else had this issue?  Any solutions?  It is not practical to create a custom marshalling object for every web control type.&lt;/p&gt;
&lt;p&gt;Still, it was good experience to use WWF and a successful attempt at integrating WWF activities into a control's life-cycle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Versions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a title="Microsoft .NET Framework" target="_blank" href="http://msdn2.microsoft.com/en-gb/netframework/default.aspx"&gt;.NET&lt;/a&gt; Framework 3.5 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Metadata&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Categories: Windows Workflow Foundation, Software Development, &lt;a title="Microsoft ASP.NET" target="_blank" href="http://msdn2.microsoft.com/en-gb/asp.net/default.aspx"&gt;ASP.NET&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt;Additional keywords: ExternalDataEventArgs, ExternalDataExchangeService, DefaultWorkflowSchedulerService, ManualWorkflowSchedulerService &lt;/li&gt;
&lt;li&gt;Technorati Tags: 
&lt;a href="http://technorati.com/tags/.NET" rel="tag"&gt;.NET&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/software%20development" rel="tag"&gt;software development&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/Windows%20Workflow%20Foundation" rel="tag"&gt;Windows Workflow Foundation&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/WF" rel="tag"&gt;WF&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/marshalling" rel="tag"&gt;marshalling&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://blogs.interakting.co.uk/steve/aggbug/255.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stephen Horsfield</dc:creator>
            <guid>http://blogs.interakting.co.uk/steve/archive/2008/04/18/ASP.NET-Integrating-Windows-Workflow-Foundation-and-marshalling-controls.aspx</guid>
            <pubDate>Fri, 18 Apr 2008 15:19:54 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/steve/comments/255.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/steve/archive/2008/04/18/ASP.NET-Integrating-Windows-Workflow-Foundation-and-marshalling-controls.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/steve/comments/commentRss/255.aspx</wfw:commentRss>
        </item>
        <item>
            <title>EPiServer: Handling unpublished pages</title>
            <link>http://blogs.interakting.co.uk/steve/archive/2008/04/01/EPiServer-Handling-unpublished-pages.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I've recently hit an issue where some custom controls have been generating exceptions when unpublished pages exist in an &lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt; site.  In these cases, the relevant (required) properties have null values.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rather than using the standard EPiServer property controls, these pages use &lt;a title="Microsoft ASP.NET" target="_blank" href="http://msdn2.microsoft.com/en-gb/asp.net/default.aspx"&gt;ASP.NET&lt;/a&gt; data-binding and custom controls that access the required properties of EPiServer PageData objects.  They are being viewed in the editing interface by a logged-in user with full permissions.  The PageData object is sourced using a FindPagesWithCriteria operation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Any of the custom page properties accessed using PageData["PropertyName"] (in C#) return null preventing the display of any useful information and causing exceptions in various cases, such as in sorting operations and date formatting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cause&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;EPiServer does not automatically load the properties for unpublished pages.  You have to manually instruct EPiServer to load them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Check to see if the page is unpublished and (optionally) whether the user has appropriate access rights.  If appropriate, load the full version of the unpublished page and possibly store it in a PageDataCollection:&lt;/p&gt;
&lt;div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   1:&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; PageDataCollection LoadUnpublishedAsNecessary(PageDataCollection pdc, &lt;br /&gt;                                                                  &lt;span class="kwrd"&gt;bool&lt;/span&gt; clearSource)&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   3:&lt;/span&gt;     PageDataCollection pdc2 = &lt;span class="kwrd"&gt;new&lt;/span&gt; PageDataCollection();&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   4:&lt;/span&gt;  &lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   5:&lt;/span&gt;     &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (PageData p &lt;span class="kwrd"&gt;in&lt;/span&gt; pdc)&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   6:&lt;/span&gt;     {&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   7:&lt;/span&gt;         &lt;span class="kwrd"&gt;if&lt;/span&gt; (p.PendingPublish)&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   8:&lt;/span&gt;         {&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;   9:&lt;/span&gt;             AccessLevel l = p.QueryAccess();&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  10:&lt;/span&gt;             &lt;span class="kwrd"&gt;if&lt;/span&gt; (((l &amp;amp; AccessLevel.Edit) == AccessLevel.Edit) ||&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  11:&lt;/span&gt;                  ((l &amp;amp; AccessLevel.Publish) == AccessLevel.Publish))&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  12:&lt;/span&gt;             {&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  13:&lt;/span&gt;  &lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  14:&lt;/span&gt;                 PageReference r = &lt;span class="kwrd"&gt;new&lt;/span&gt; PageReference(p.PageLink.ID, &lt;span class="kwrd"&gt;true&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  15:&lt;/span&gt;                 pdc2.Add(EPiServer.Global.EPDataFactory.GetPage(r));&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  16:&lt;/span&gt;                 &lt;span class="kwrd"&gt;continue&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  17:&lt;/span&gt;             }&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  18:&lt;/span&gt;         }&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  19:&lt;/span&gt;         pdc2.Add(p);&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  20:&lt;/span&gt;     }&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  21:&lt;/span&gt;     &lt;span class="kwrd"&gt;if&lt;/span&gt; (clearSource) pdc.Clear();&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  22:&lt;/span&gt;  &lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  23:&lt;/span&gt;     &lt;span class="kwrd"&gt;return&lt;/span&gt; pdc2;&lt;/pre&gt;
&lt;pre class="alteven"&gt;&lt;span class="lnum"&gt;  24:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;&lt;a href="http://www.episerver.com/sv/EPiServer_Knowledge_Center/Developer-Forum2/EPiServer-Developer-Forums-/1805/15069/"&gt;http://www.episerver.com/sv/EPiServer_Knowledge_Center/Developer-Forum2/EPiServer-Developer-Forums-/1805/15069/&lt;/a&gt;&lt;/font&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Versions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;EPiServer 5, EPiServer 4.6 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Metadata&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Categories: &lt;a title="Microsoft .NET Framework" target="_blank" href="http://msdn2.microsoft.com/en-gb/netframework/default.aspx"&gt;.NET&lt;/a&gt;, ASP.NET, EPiServer, Software Development &lt;/li&gt;
    &lt;li&gt;Additional keywords: FindPagesWithCriteria, saved pages, unpublished, property values null, missing properties &lt;/li&gt;
&lt;li&gt;Technorati Tags: 
&lt;a href="http://technorati.com/tags/.NET" rel="tag"&gt;.NET&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/EPiServer" rel="tag"&gt;EPiServer&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/software%20development" rel="tag"&gt;software development&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/data%20binding" rel="tag"&gt;data binding&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/page%20publishing" rel="tag"&gt;page publishing&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://blogs.interakting.co.uk/steve/aggbug/242.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stephen Horsfield</dc:creator>
            <guid>http://blogs.interakting.co.uk/steve/archive/2008/04/01/EPiServer-Handling-unpublished-pages.aspx</guid>
            <pubDate>Tue, 01 Apr 2008 10:45:55 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/steve/comments/242.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/steve/archive/2008/04/01/EPiServer-Handling-unpublished-pages.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/steve/comments/commentRss/242.aspx</wfw:commentRss>
        </item>
        <item>
            <title>ASP.NET: Managing Browser History with AJAX and UpdatePanels</title>
            <link>http://blogs.interakting.co.uk/steve/archive/2008/01/25/ASP.NET-Managing-Browser-History-with-AJAX-and-UpdatePanels.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When you are using the (very helpful) UpdatePanel, the browser doesn't keep track of the asynchronous postbacks.  This means that when the user clicks the back button in the browser, they go to the navigation prior to the last full postback.&lt;/p&gt;
&lt;p&gt;How can you resolve this?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can solve this by programming the browser, but it is even easier with two alternative server control solutions:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a title="Microsoft ASP.NET" target="_blank" href="http://msdn2.microsoft.com/en-gb/asp.net/default.aspx"&gt;ASP.NET&lt;/a&gt; Futures: the History server control and the Sys.Application client object.  See &lt;a title="http://quickstarts.asp.net/Futures/ajax/doc/history.aspx" target="_blank" href="http://quickstarts.asp.net/Futures/ajax/doc/history.aspx"&gt;ASP.NET Futures (July 2007): Managing Browser History and Back Button Support in ASP.NET AJAX&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt;&lt;font face="Arial"&gt;Nikhil Kothari's Weblog : &lt;a title="http://www.nikhilk.net/UpdateControls.aspx" href="http://www.nikhilk.net/UpdateControls.aspx"&gt;UpdateControls: UpdateHistory and AnimatedUpdatePanel&lt;/a&gt;&lt;/font&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Versions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Microsoft &lt;a title="Microsoft .NET Framework" target="_blank" href="http://msdn2.microsoft.com/en-gb/netframework/default.aspx"&gt;.NET&lt;/a&gt; Framework 2.0 &lt;/li&gt;
    &lt;li&gt;&lt;a title="Microsoft ASP.NET" target="_blank" href="http://msdn2.microsoft.com/en-gb/asp.net/default.aspx"&gt;ASP.NET&lt;/a&gt; AJAX 1.0 &lt;/li&gt;
    &lt;li&gt;&lt;a title="Microsoft ASP.NET" target="_blank" href="http://msdn2.microsoft.com/en-gb/asp.net/default.aspx"&gt;ASP.NET&lt;/a&gt; Futures July 2007 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Metadata&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Categories: Software development, &lt;a title="Microsoft ASP.NET" target="_blank" href="http://msdn2.microsoft.com/en-gb/asp.net/default.aspx"&gt;ASP.NET&lt;/a&gt;, &lt;a title="Microsoft .NET Framework" target="_blank" href="http://msdn2.microsoft.com/en-gb/netframework/default.aspx"&gt;.NET&lt;/a&gt;, AJAX &lt;/li&gt;
    &lt;li&gt;Additional keywords: browser support, back button, history, UpdateHistory, History control, Sys.Application &lt;/li&gt;
&lt;li&gt;Technorati Tags: 
&lt;a href="http://technorati.com/tags/software%20development" rel="tag"&gt;software development&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/AJAX" rel="tag"&gt;AJAX&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/UpdatePanel" rel="tag"&gt;UpdatePanel&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/UpdateHistory" rel="tag"&gt;UpdateHistory&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://blogs.interakting.co.uk/steve/aggbug/191.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stephen Horsfield</dc:creator>
            <guid>http://blogs.interakting.co.uk/steve/archive/2008/01/25/ASP.NET-Managing-Browser-History-with-AJAX-and-UpdatePanels.aspx</guid>
            <pubDate>Fri, 25 Jan 2008 07:23:17 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/steve/comments/191.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/steve/archive/2008/01/25/ASP.NET-Managing-Browser-History-with-AJAX-and-UpdatePanels.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/steve/comments/commentRss/191.aspx</wfw:commentRss>
        </item>
        <item>
            <title>EPiServer: FindPagesWithCriteria, Multiple Criteria and Boolean Property Tests</title>
            <link>http://blogs.interakting.co.uk/steve/archive/2008/01/18/EPiServer-FindPagesWithCriteria-Multiple-Criteria-and-Boolean-Property-Tests.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This should be easy, but easy it is not.  I'm using an &lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt; 4.6 site for this one, so things might've improved in more recent versions, but this caused me a lot of trial and error.  I hope this post saves you the hassle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I've got a Selected/Unselected property set on a Page Type, and I want to search for pages with this property checked.  I also want to take account of publishing dates and I've got another date property to check too.&lt;/p&gt;
&lt;p&gt;The &lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt; Selected/Unselected property type returns True when selected and Null when it is not.  This causes some problems because boolean logic is more complicated when Null values are involved.  This is because Null represents "I don't know".  If you ask, "Is A equal to B?" and A or B is Null, then the answer is Null... always!&lt;/p&gt;
&lt;p&gt;The other problem is that I can only do certain expressions in the query.  I can say that some criteria are optional (union set) and some properties are required (intersection set).  I cannot reduce or expand a single clause and this limits what is allowed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My solution&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;I need to find pages with a date property less than the current date.  I'll call this property RequiredBefore &lt;/li&gt;
    &lt;li&gt;I need to find pages with a boolean property that is set.  I'll call this property Flag &lt;/li&gt;
    &lt;li&gt;I need to find pages that are currently published and accessible to the current user &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here's my code:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PageDataCollection col = new PageDataCollection();&lt;br /&gt;
PropertyCriteriaCollection propcol = new PropertyCriteriaCollection();&lt;br /&gt;
PropertyCriteria criteria = new PropertyCriteria();&lt;br /&gt;
criteria.Type = PropertyDataType.Date;&lt;br /&gt;
criteria.Name = "RequiredBefore";&lt;br /&gt;
criteria.Value = DateTime.Now.ToString();&lt;br /&gt;
criteria.Condition = EPiServer.Filters.CompareCondition.GreaterThan;&lt;br /&gt;
criteria.Required = true;&lt;br /&gt;
propcol.Add(criteria);&lt;br /&gt;
&lt;br /&gt;
criteria = new PropertyCriteria();&lt;br /&gt;
criteria.Type = PropertyDataType.Boolean;&lt;br /&gt;
criteria.Name = "VisibleInSummary";&lt;br /&gt;
criteria.IsNull = false;&lt;br /&gt;
criteria.Value = true.ToString();&lt;br /&gt;
criteria.Condition = EPiServer.Filters.CompareCondition.Equal;&lt;br /&gt;
criteria.Required = true;&lt;br /&gt;
propcol.Add(criteria);&lt;br /&gt;
&lt;br /&gt;
PageDataCollection tempcol = new PageDataCollection();&lt;br /&gt;
tempcol = Global.EPDataFactory.FindPagesWithCriteria(CurrentPageLink, propcol, EPiServer.Security.AccessLevel.Read);&lt;br /&gt;
&lt;br /&gt;
// Check pages are published&lt;br /&gt;
foreach (PageData p in tempcol)&lt;br /&gt;
{&lt;br /&gt;
  if (p.Status == VersionStatus.Published)&lt;br /&gt;
    col.Add(p);&lt;br /&gt;
}&lt;br /&gt;
tempcol.Clear(); &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I'm checking for publishing dates after retrieving the pages which is inefficient.  I'm doing this because it is otherwise difficult to handle for the possibility of publishing dates being null, and this way I let &lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt; decide how to check for whether a page is considered published.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Versions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt; 4 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Metadata&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Categories: Software development, &lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt;, &lt;a title="Microsoft ASP.NET" target="_blank" href="http://msdn2.microsoft.com/en-gb/asp.net/default.aspx"&gt;ASP.NET&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt;Additional keywords: EPDataFactory, FindPagesWithCriteria, Search, multiple criteria, Publishing dates, flags, boolean, selected/unselected, PropertyCriteria.IsNull, PropertyCriteria.Required, EPiServer FindPagesWithCriteria, FindPagesWithCriteria EPiServer &lt;/li&gt;
&lt;li&gt;Technorati Tags: 
&lt;a href="http://technorati.com/tags/software%20development" rel="tag"&gt;software development&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/.NET" rel="tag"&gt;.NET&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/EPiServer" rel="tag"&gt;EPiServer&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/FindPagesWithCriteria" rel="tag"&gt;FindPagesWithCriteria&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/search" rel="tag"&gt;search&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://blogs.interakting.co.uk/steve/aggbug/181.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stephen Horsfield</dc:creator>
            <guid>http://blogs.interakting.co.uk/steve/archive/2008/01/18/EPiServer-FindPagesWithCriteria-Multiple-Criteria-and-Boolean-Property-Tests.aspx</guid>
            <pubDate>Fri, 18 Jan 2008 15:53:28 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/steve/comments/181.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/steve/archive/2008/01/18/EPiServer-FindPagesWithCriteria-Multiple-Criteria-and-Boolean-Property-Tests.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/steve/comments/commentRss/181.aspx</wfw:commentRss>
        </item>
        <item>
            <title>EPiServer: PropertyCriteria &amp;mdash; GreaterThan Value or Value GreaterThan?</title>
            <link>http://blogs.interakting.co.uk/steve/archive/2008/01/18/EPiServer-PropertyCriteria-mdash-GreaterThan-Value-or-Value-GreaterThan.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using &lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt;, you may use the FindPagesWithCriteria method to retrieve a list of pages based on certain properties, but the helpfully enumerated conditions may be confusing.  After all, with a binary inequality operator it is quite important to know the order of the expressions...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Context&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You use PropertyCriteria objects to set the criteria for a search and you can use the Condition property to determine the operator.  Suppose you selected the GreaterThan operator:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;IF --PROPERTY-- &amp;gt; --VALUE-- THEN&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;But is it actually:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;IF --VALUE-- &amp;gt; --PROPERTY-- THEN&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The two operations give entirely different answers, and they are not even inverse.  The inverse operator to &amp;gt; (greater-than) is &amp;lt;= (less-than-or-equal).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The answer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A search through the &lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt; documentation reveals that the answer is that &lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt; will use:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;IF --PROPERTY-- --CONDITION-- --VALUE-- THEN&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Versions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt; 5 &lt;/li&gt;
    &lt;li&gt;&lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt; 4 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Metadata&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Categories: Software development, &lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt;, &lt;a title="Microsoft ASP.NET" target="_blank" href="http://msdn2.microsoft.com/en-gb/asp.net/default.aspx"&gt;ASP.NET&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt;Additional keywords: EPDataFactory, FindPagesWithCriteria, Search, Publishing dates, binary operator, inequality, Greater than, Less than, CompareCondition, PageStartPublish, PageStopPublish &lt;/li&gt;
&lt;li&gt;Technorati Tags: 
&lt;a href="http://technorati.com/tags/software%20development" rel="tag"&gt;software development&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/.NET" rel="tag"&gt;.NET&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/EPiServer" rel="tag"&gt;EPiServer&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/FindPagesWithCriteria" rel="tag"&gt;FindPagesWithCriteria&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/search" rel="tag"&gt;search&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://blogs.interakting.co.uk/steve/aggbug/180.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stephen Horsfield</dc:creator>
            <guid>http://blogs.interakting.co.uk/steve/archive/2008/01/18/EPiServer-PropertyCriteria-mdash-GreaterThan-Value-or-Value-GreaterThan.aspx</guid>
            <pubDate>Fri, 18 Jan 2008 14:15:28 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/steve/comments/180.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/steve/archive/2008/01/18/EPiServer-PropertyCriteria-mdash-GreaterThan-Value-or-Value-GreaterThan.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/steve/comments/commentRss/180.aspx</wfw:commentRss>
        </item>
        <item>
            <title>EPiServer: Problems importing data &amp;mdash; POST fails</title>
            <link>http://blogs.interakting.co.uk/steve/archive/2008/01/18/EPiServer-Problems-importing-data-mdash-POST-fails.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I've been importing a live &lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt; site into a development environment for further work.  Normally, this works without problem, but this time I've been getting a POST error, but nothing informative.  What's happening?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A quick look at the event logs on the IIS server quickly identifies the problem: the file exceeds the upload limit.  Of course this is less likely to happen in a normal development run, but once there is a fair amount of data it fails.  If I hadn't spotted the error in the event log, I might have been stuck for some time.&lt;/p&gt;
&lt;p&gt;The default &lt;a title="Microsoft ASP.NET" target="_blank" href="http://msdn2.microsoft.com/en-gb/asp.net/default.aspx"&gt;ASP.NET&lt;/a&gt; upload limit is 4 MB, so if you need more you will have to change the web.config settings.  The element you have to change is the maxRequestLength attribute on the &amp;lt;system.web&amp;gt;&amp;lt;httpRuntime&amp;gt; element.  The size is specified in KB, so for a 32 MB limit, use the following:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;system.web&amp;gt; &lt;br /&gt;
  &amp;lt;httpruntime maxrequestlength="32768" /&amp;gt; &lt;br /&gt;
&amp;lt;/system.web&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a title="http://msdn2.microsoft.com/en-us/library/e1f13641(VS.71).aspx" href="http://msdn2.microsoft.com/en-us/library/e1f13641(VS.71).aspx"&gt;&amp;lt;httpRuntime&amp;gt; Element (Microsoft MSDN)&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Versions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a title="Microsoft Windows Server 2003" target="_blank" href="http://www.microsoft.com/windowsserver2003/default.mspx"&gt;Windows Server 2003&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt;&lt;a title="Microsoft Windows XP" target="_blank" href="http://www.microsoft.com/windows/products/windowsxp/default.mspx"&gt;Windows XP&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt;Microsoft &lt;a title="Microsoft .NET Framework" target="_blank" href="http://msdn2.microsoft.com/en-gb/netframework/default.aspx"&gt;.NET&lt;/a&gt; Framework 2.0 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Metadata&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Categories: Software Development, &lt;a title="Microsoft ASP.NET" target="_blank" href="http://msdn2.microsoft.com/en-gb/asp.net/default.aspx"&gt;ASP.NET&lt;/a&gt;, IIS, &lt;a title="EPiServer Content Management System" target="_blank" href="http://www.episerver.com"&gt;EPiServer&lt;/a&gt; &lt;/li&gt;
    &lt;li&gt;Additional keywords: import, POST, error, upload limit &lt;/li&gt;
&lt;li&gt;Technorati Tags: 
&lt;a href="http://technorati.com/tags/software%20development" rel="tag"&gt;software development&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/IT%20Management" rel="tag"&gt;IT Management&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/.NET" rel="tag"&gt;.NET&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/ASP.NET" rel="tag"&gt;ASP.NET&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/EPiServer" rel="tag"&gt;EPiServer&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/import" rel="tag"&gt;import&lt;/a&gt;,
&lt;a href="http://technorati.com/tags/problem" rel="tag"&gt;problem&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://blogs.interakting.co.uk/steve/aggbug/179.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stephen Horsfield</dc:creator>
            <guid>http://blogs.interakting.co.uk/steve/archive/2008/01/18/EPiServer-Problems-importing-data-mdash-POST-fails.aspx</guid>
            <pubDate>Fri, 18 Jan 2008 10:47:51 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/steve/comments/179.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/steve/archive/2008/01/18/EPiServer-Problems-importing-data-mdash-POST-fails.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/steve/comments/commentRss/179.aspx</wfw:commentRss>
        </item>
        <item>
            <title>ASP.NET: Providing browser specific alternatives in ASP.NET</title>
            <link>http://blogs.interakting.co.uk/steve/archive/2008/01/03/Providing-browser-specific-alternatives-in-ASP.NET.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;Suppose that you have found the perfect control that works with almost all the browsers you need to support, but suppose it has breaking functionality for a particular browser.  How can you solve this problem?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir="ltr"&gt;&lt;strong&gt;One Solution&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;Sometimes the easiest solution may be a browser specific adapter.  The adapter can remove the original control and replace it with one that is only targeted at a single browser (or a subset).  Then, when the preferred control is fixed, it can be used directly without changing the application code.&lt;/p&gt;
&lt;p&gt;This solution has at least two components:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;A change to a browser file in the App_Browsers folder &lt;/li&gt;
    &lt;li&gt;A control adapter that implements the required functionality.  Optionally using an alternative control. &lt;/li&gt;
    &lt;li&gt;(Optional) an alternative control &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;u&gt;Changing the App_Browsers file&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;In the appropriate browser file, add an adapter entry:&lt;/p&gt;
&lt;pre&gt;&amp;lt;controlAdapters&amp;gt;
    &amp;lt;adapter controltype="YourNamespace.YourOriginalControl"
             adaptertype="YourNamespace.YourControlAdapter" /&amp;gt;
&amp;lt;/controlAdapters&amp;gt;&lt;/pre&gt;
&lt;p&gt; &lt;u&gt;The Control Adapter&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;The Control Adapter is provided by a class derived from System.Web.UI.Adapters.ControlAdapter.  The adapter can provide event handlers for standard events, but typically the OnLoad and Render methods are overidden.&lt;/p&gt;
&lt;p&gt;The OnLoad method calls base.OnLoad and might register some client script using the Page.ClientScript.RegisterClientScriptBlock method.  It might also enable, disable, add or remove other controls on the page.  The OnLoad method may also change the properties of the original control, perhaps adding additional client-side events.&lt;/p&gt;
&lt;p&gt;The Render method calls base.Render to render the original control's content.  However, it might wrap this in other HTML output that the client script uses to control display or handle additional events.&lt;/p&gt;
&lt;p&gt;You use the this.Control property to access the &lt;em&gt;adapted&lt;/em&gt; control.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir="ltr"&gt;&lt;strong&gt;Comments&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p&gt;At the time of writing, the ASP.NET AJAX toolkit's HoverMenuExtender control doesn't work perfectly in Internet Explorer 6.  This method was used to remove the HoverMenuExtender from IE6 output and to replace it with custom HTML, JavaScript and event handling.  The adapter was applied to the display control, not to the HoverMenuExtender itself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p dir="ltr"&gt;&lt;strong&gt;Versions&lt;/strong&gt;&lt;/p&gt;
&lt;ul dir="ltr"&gt;
    &lt;li&gt;
    &lt;div&gt;Microsoft .NET Framework 3.0&lt;/div&gt;
    &lt;/li&gt;
    &lt;li&gt;
    &lt;div&gt;ASP.NET AJAX Toolkit &lt;font face="Arial"&gt;1.0.10920.23306&lt;/font&gt;&lt;/div&gt;
    &lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://blogs.interakting.co.uk/steve/aggbug/136.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Stephen Horsfield</dc:creator>
            <guid>http://blogs.interakting.co.uk/steve/archive/2008/01/03/Providing-browser-specific-alternatives-in-ASP.NET.aspx</guid>
            <pubDate>Thu, 03 Jan 2008 16:21:50 GMT</pubDate>
            <wfw:comment>http://blogs.interakting.co.uk/steve/comments/136.aspx</wfw:comment>
            <comments>http://blogs.interakting.co.uk/steve/archive/2008/01/03/Providing-browser-specific-alternatives-in-ASP.NET.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.interakting.co.uk/steve/comments/commentRss/136.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>