<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>thinking in geek &#187; asp.net</title>
	<atom:link href="http://joshrobb.com/blog/category/aspnet/feed/" rel="self" type="application/rss+xml" />
	<link>http://joshrobb.com/blog</link>
	<description>tagline's are so web2.0</description>
	<lastBuildDate>Wed, 02 Jun 2010 14:47:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>ASP.NET == Usability disaster?</title>
		<link>http://joshrobb.com/blog/2008/09/29/aspnet-usability-disaster/</link>
		<comments>http://joshrobb.com/blog/2008/09/29/aspnet-usability-disaster/#comments</comments>
		<pubDate>Mon, 29 Sep 2008 09:24:08 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[web architecture]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/?p=18</guid>
		<description><![CDATA[[This has been in the queue for a long time - over 12 months - codebetter just tipped me over the edge!] Peter Van Dijck asks: I’ve only worked twice with companies using .NET for web interfaces, and in both cases the UI was a disaster and the usability problems guaranteed lots of consulting hours.. [...]]]></description>
			<content:encoded><![CDATA[<p>[This has been in the queue for a long time - over 12 months - codebetter just tipped me over the edge!]</p>
<p><a href="http://poorbuthappy.com/ease/archives/2007/05/01/3626/3626">Peter Van Dijck asks</a>:</p>
<blockquote><p>I’ve only worked twice with companies using .NET for web interfaces, and in both cases the UI was a disaster and the usability problems guaranteed lots of consulting hours.. Why is that? Or was that a fluke? (2 cases is hardly proof of anything) I know it’s possible to make usable and elegant web UI with any technology, but does .NET somehow encourage bad UI?</p></blockquote>
<p>This is a great question and in my opinion &#8211; the answer is yes. (Assuming that Peter really means WebForms.)  <img style="float:right" title="spike pit of death" src="http://www.hotkey.net.au/~marshalle/booby/pit.gif" alt="spike pit of death" width="350" height="321" /></p>
<p>This is demonstrated in so many small ways by framework defaults which are totally brain dead (__doPostBack anyone?). Rather than lead dev&#8217;s into the <a href="http://blogs.msdn.com/brada/archive/2003/10/02/50420.aspx">pit of success</a> &#8211; the framework leads devs to the spiky elephant trap of death. </p>
<p> <br />
What&#8217;s that &#8211; an example? How about the &lt;customErrors&gt; defaults. When an error occurs during processing an ASP.NET request &#8211; the <strong>default</strong> behavior of a new web.config is to redirect the user to another URL. This is what a new web.config looks like in VS2k5. </p>
<p>        &lt;customErrors mode=&#8221;RemoteOnly&#8221; defaultRedirect=&#8221;GenericErrorPage.htm&#8221;&gt;</p>
<p>            &lt;error statusCode=&#8221;403&#8243; redirect=&#8221;NoAccess.htm&#8221; /&gt;</p>
<p>            &lt;error statusCode=&#8221;404&#8243; redirect=&#8221;FileNotFound.htm&#8221; /&gt;</p>
<p>        &lt;/customErrors&gt;</p>
<div>This is really brain dead behavior! Let&#8217;s count the ways: </div>
<div>1. There&#8217;s no way to change the HTTP status code from a html page. (E.g. &#8211; should be 404, 500 etc). This is just flat out bad &#8211; status codes are important for lots of reasons.</div>
<div>2. The <strong><em>effing</em></strong> URL will change. This makes it difficult to correct typing errors or retry a request in case of a server error (500). </div>
<div>3. Those files don&#8217;t even exist! You can get a 404 when the real error is a 500 because the file that your getting redirected to don&#8217;t <strong>effing</strong> exist! </div>
<div>This just happened to me &#8211; I was just wondering if there is a port of the monorail SmartGridComponent to ASP.NET MVC. I do a Google search and get a <a href="http://devlicio.us/blogs/billy_mccafferty/archive/2008/08/10/41786.aspx">likely looking result for Billy McCafferty&#8217;s blog</a>. I click on the link and I get the following page: </div>
<div>
<blockquote>
<div><strong>Oops something went wrong!</strong></div>
<div>Either the site is offline or an unhandled error occurred. We apologize and have logged the error. Please try your request again or if you know who your site administrator is let them know too.</div>
</blockquote>
</div>
<p> </p>
<p>The URL in the browsers address bar is: </p>
<blockquote><p>http://devlicio.us/error.htm?aspxerrorpath=/themes/blogs/default/post.aspx</p></blockquote>
<div>HOW the F$%K do I try my request again?</div>
<div>If I&#8217;ve opened this result in a new tab (which is my habbit) I&#8217;m screwed! There is no back button, refresh (F5 or whatever) just reloads the error page and will <em>never</em> show me the correct page.</div>
<div>If I just clicked the link &#8211; the back button takes me back to my google search where I can click on the link again &#8211; refresh is still borked. </div>
<p>Another example? Linkbutton? Anyone who&#8217;s tried to open a link in a new tab/window and got a blank window with a URL like: javascript:__doPostBack(&#8216;ctl00$Masthead1$LocaleManagement$ctl00$ctl05&#8242;,&#8221;) &#8211; knows the pain I&#8217;m talking about. </p>
<p>Go on &#8211; right now &#8211; go try and open a MSDN library page in different language in a new tab. (It&#8217;s the little menu up the top right where it says (e.g.): United States &#8211; English). </p>
<p>In my apps &#8211; I fix this by disabling customErrors and writing new error handling code which both maintains the url and returns the correct HTTP statuses &#8211; but this is code which I should not have to write. This is code which all web servers/apps need to implement correctly &#8211; it should be automatic. We shouldn&#8217;t have to write custom code to get a HTTP/404 returned when an app encounters a missing file!</p>
]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2008/09/29/aspnet-usability-disaster/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ControllerAction] and sane defaults</title>
		<link>http://joshrobb.com/blog/2007/12/11/controlleraction-and-sane-defaults/</link>
		<comments>http://joshrobb.com/blog/2007/12/11/controlleraction-and-sane-defaults/#comments</comments>
		<pubDate>Tue, 11 Dec 2007 02:04:35 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[architecture]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/2007/12/11/controlleraction-and-sane-defaults/</guid>
		<description><![CDATA[[Ed: For anyone who's living under a bush Microsoft have released a CTP of the new ASP.NET MVC framework. ] I&#8217;m reluctant to get involved in this &#8211; but I feel like there&#8217;s another side to this story which is worth considering. Since it was first presented at altnetconf &#8211; the decision to require users1 [...]]]></description>
			<content:encoded><![CDATA[<p>[Ed: For anyone who's living under a bush Microsoft have released a CTP of the new ASP.NET MVC framework. ]</p>
<p>I&#8217;m reluctant to get involved in this &#8211; but I feel like there&#8217;s another side to this story which is worth considering.</p>
<p>Since it was first presented at altnetconf &#8211; the decision to require users<sup>1</sup> to have to specify which methods on controllers are available to be routed to ([ControllerAction]) and which view (RenderView()) to render has come in for <a href="http://www.lostechies.com/blogs/sean_chambers/archive/2007/12/08/phil-haack-posts-about-asp-net-mvc.aspx">a</a> <a href="http://tech.groups.yahoo.com/group/altnetconf/msearch?query=%5BControllerAction%5D&amp;submit=Search&amp;charset=ISO-8859-1">lot </a>of <a href="http://ayende.com/Blog/archive/2007/12/08/Configuration-over-Convention.aspx">criticism</a>.</p>
<p>Lots of the brightest and best minds in the .net world are screaming about this in various forums. Claiming that it violates:</p>
<ul>
<li> the DRY principle</li>
<li>convention over configuration</li>
<li>best practice in other frameworks</li>
<li>commonly accepted laws of physics</li>
</ul>
<p>Not one of the people complaining is going to use this framework vanilla. They are going to add their own layer of behavior over the top. It&#8217;s been designed to make it easy (trivial in this case) to extend and change the policy.</p>
<p>Sane defaults are <strong>really</strong> important for frameworks. Yes they get in the way of power users.  Yes it normally takes a power user 10 minutes to work around them and add that piece of code to their toolbox from then on.</p>
<p>I don&#8217;t know how many people were following the emergent rails community back in 2005 when the Google <a href="http://www.37signals.com/svn/archives2/google_web_accelerator_hey_not_so_fast_an_alert_for_web_app_designers.php">Web Accelerator</a> was <a href="http://radar.oreilly.com/archives/2005/05/google_web_acce_1.html">released</a> &#8211; but many of them (including the <a href="http://www.loudthinking.com/arc/000454.html">smartest</a><sup>2</sup> ) got a <a href="http://www.intertwingly.net/blog/2005/05/06/This-Stuff-Matters">salient</a> <a href="http://www.intertwingly.net/blog/2005/10/24/Theyre-baaaaaaack">lesson</a> in <a href="http://www.w3.org/2001/tag/doc/whenToUseGet.html">GET idempotence</a>. (i.e. GET Order?id=23&amp;action=delete &#8211; should <em>never</em> delete anything).</p>
<p>Here was a situation where the framework (rails) came with not so safe defaults and bad example code which encouraged doing the wrong thing.  These days &#8211; rails has absorbed this lesson so completely that it could be described as a REST server and in some ways leads developers into following best practices for web apps by default.</p>
<p>I really don&#8217;t understand what the huge deal is here? This seems as clear cut to me as the built in RequestValidation in ASP.NET or automatically escaping SqlParameters for SQL injection. Sure &#8211; if your a power user it can be a pain &#8211; but it takes 10 seconds to turn off and then your responsible when your site get p0wn&#8217;d.</p>
<p>It&#8217;s not like ControllerBase is sealed.</p>
<ol class="footnotes"><li id="footnote_0_48" class="footnote">by default &#8211; but <a href="http://haacked.com/archive/2007/12/09/extending-asp.net-mvc-to-add-conventions.aspx">easily modifiable</a></li><li id="footnote_1_48" class="footnote">or is that loudest?</li></ol>]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2007/12/11/controlleraction-and-sane-defaults/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Multiple instances of memcached on win32</title>
		<link>http://joshrobb.com/blog/2007/11/08/multiple-instances-of-memcached-on-win32/</link>
		<comments>http://joshrobb.com/blog/2007/11/08/multiple-instances-of-memcached-on-win32/#comments</comments>
		<pubDate>Thu, 08 Nov 2007 18:04:45 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[web architecture]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/2007/11/08/multiple-instances-of-memcached-on-win32/</guid>
		<description><![CDATA[It seems like the win32 crowd is discovering memcached. I&#8217;ve got a couple of support queries about it over the last month or two and I thought I&#8217;d post an interesting one here: &#8220;How can you run multiple instances of memcached on a single machine?&#8221; There&#8217;s a couple of reasons why you&#8217;d want to do [...]]]></description>
			<content:encoded><![CDATA[<p>It seems like the win32 crowd is <a href="http://www.25hoursaday.com/weblog/2007/07/05/ASPNETCachingVsMemcachedSeekingEfficientDataPartitioningLookupAndRetrieval.aspx">discovering</a> <a href="http://jehiah.cz/projects/memcached-win32/">memcached</a>. I&#8217;ve got a couple of support queries about it over the last month or two and I thought I&#8217;d post an interesting one here:</p>
<blockquote><p>&#8220;How can you run multiple instances of memcached on a single machine?&#8221;</p></blockquote>
<p>There&#8217;s a couple of reasons why you&#8217;d want to do this.  The most obvious is that you&#8217;ve got multiple clients being serviced on a single machine and you want to absolutely ensure that data is not leaking from one client to another.</p>
<p>If you want to setup multiple instances the once you&#8217;ve got the win32 port downloaded and unziped somewhere you need to use the following magic incantation:</p>
<blockquote><p>sc create memcached2 binPath= &#8220;c:\memcached\memcached.exe -p 11111 -d runservice&#8221;</p></blockquote>
<p>You can pass any other params you wish (e.g. amount of memory to use). To run multiple instances just install multiple services with different names/ports.</p>
<p>Note: &#8220;sc&#8221; is the command line tool for working with the win32 service control manager. It allows you to stop/start/create/delete and more &#8211; windows services. Check out it&#8217;s command line help by typing &#8220;sc&#8221;<enter> at the command line.</p>
]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2007/11/08/multiple-instances-of-memcached-on-win32/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC</title>
		<link>http://joshrobb.com/blog/2007/10/16/aspnet-mvc/</link>
		<comments>http://joshrobb.com/blog/2007/10/16/aspnet-mvc/#comments</comments>
		<pubDate>Tue, 16 Oct 2007 19:25:51 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[web architecture]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/2007/10/16/aspnet-mvc/</guid>
		<description><![CDATA[I got a chance over the weekend to watch the videos from altnetconf on the new Microsoft ASP.NET MVC framework. It&#8217;s a really exciting development. Anyway &#8211; as I&#8217;ve listened I&#8217;ve got myself a list of questions about features &#8211; I figured I&#8217;d put them here so I can see how they get on. In [...]]]></description>
			<content:encoded><![CDATA[<p>I got a chance over the weekend to watch the <a href="http://www.hanselman.com/blog/ScottGuMVCPresentationAndScottHaScreencastFromALTNETConference.aspx">videos</a> from <a href="http://www.altnetconf.com/">altnetconf</a> on the new <a href="http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx">Microsoft ASP.NET MVC framework</a>. It&#8217;s a really exciting development. Anyway &#8211; as I&#8217;ve listened I&#8217;ve got myself a list of questions about features &#8211; I figured I&#8217;d put them here so I can see how they get on.</p>
<ol>
<li>In views ScottGu shows how to write views using &lt;%=  %&gt;  style code. Now that was all good when asp classic was a new and good idea. These days some (lots?) of people think that HtmlEncode&#8217;ing by default is a good idea. It makes attacks like XSS and CSRF more difficult and is the default for much of the WebForms controls. It&#8217;d be nice to see support for this integrated into the WebForms compiler or maybe a rails like &lt;%h=  %&gt; option.</li>
<li>Scott demos a new extension method: .UpdateFrom(NameValueCollection) which allows you to update a class from a NameValueCollection. This is super sweet &#8211; especially with the built in reflection caching he mentions. I&#8217;d like to know if this extension methos has support for whitelist/blacklist of incoming property names/values? (Like the <a href="http://www.castleproject.org/monorail/documentation/trunk/usersguide/smartcontrolleradv.html">MonoRail</a> <a href="http://api.castleproject.org/html/P_Castle_MonoRail_Framework_DataBindAttribute_Exclude.htm">DataBindAttribute.Exclude/Allow</a> properties). IMO &#8211; this is an important security consideration.</li>
<li>Can you configure the routing rules based on HostHeader+Url or is it just Url?)</li>
<li>In the example he uses &#8211; the Layout is specified by the View (i.e. MasterPage=&#8221;") &#8211; this is an improper separation of concerns &#8211; it should be upto the Controller to specify the &#8220;layout&#8221; (masterpage).</li>
</ol>
<p>Anyway &#8211; it&#8217;s really just a list of things I&#8217;ve thought of and am curious about. Overall I&#8217;m amazingly excited and really looking forward to getting my hands on some bits.</p>
]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2007/10/16/aspnet-mvc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>String Manipulation DSL&#8217;s</title>
		<link>http://joshrobb.com/blog/2007/09/05/string-manipulation-dsls/</link>
		<comments>http://joshrobb.com/blog/2007/09/05/string-manipulation-dsls/#comments</comments>
		<pubDate>Wed, 05 Sep 2007 22:54:41 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/2007/09/05/string-manipulation-dsls/</guid>
		<description><![CDATA[Mats comments on my previous post: &#8220;But I guess what I’m saying is that the code for inserting that string using just strings may look even worse when you come back to look at it a week later…&#8221; If your thinking that I&#8217;m talking about code like: StringBuilder sb = new StringBuilder(); sb.Append(&#8220;xxx &#8211; yyy [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.matshelander.com/wordpress/">Mats</a> comments on my <a href="http://joshrobb.com/blog/2007/09/04/webforms-hurt-me-good/">previous post</a>:</p>
<p style="margin-left: 40px">&#8220;But I guess what I’m saying is that the code for inserting that string using just strings may look even worse when you come back to look at it a week later…&#8221;</p>
<p>If your thinking that I&#8217;m talking about code like:</p>
<p style="margin-left: 40px">StringBuilder sb = new StringBuilder();<br />
sb.Append(&#8220;xxx &#8211; yyy [somevar] zzz&#8221;);<br />
Response.Write(sb.ToString().Replace(&#8220;[somevar]&#8220;,&#8221;somevalue&#8221;));</p>
<p>Then I&#8217;d agree. This is a maintenance nightmare. Solving this is a well known &#8220;pattern&#8221;. Use a domain specific language (DSL). In this case &#8211; we&#8217;d use a template language. Imagine a hypothetical template DSL:</p>
<p style="margin-left: 40px">TemplateContext context = new TemplateContext(&#8220;somevar&#8221;,&#8221;somevalue&#8221;);<br />
Response.Write(Template.Eval(&#8220;xxx &#8211; yyy &lt;%=somevar %&gt; zzz&#8221;,context));</p>
<p>It is possible to write this in a way that is maintainable and still readable a week later. <a href="http://codebetter.com/blogs/scott.bellware/">Scott Bellware&#8217;s</a> <a href="http://joshrobb.com/blog/2007/08/02/soc-in-webforms/">comment</a> still sums this up for me.</p>
]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2007/09/05/string-manipulation-dsls/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WebForms hurt me good&#8230;</title>
		<link>http://joshrobb.com/blog/2007/09/04/webforms-hurt-me-good/</link>
		<comments>http://joshrobb.com/blog/2007/09/04/webforms-hurt-me-good/#comments</comments>
		<pubDate>Tue, 04 Sep 2007 00:01:07 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[web architecture]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/2007/09/04/webforms-hurt-me-good/</guid>
		<description><![CDATA[Today I spent a long time trying to add a control to the Page.Controls collection from a MasterPage. Short version: without writing a(nother) IHttpModule which hooks Page_PreLoad and fires off an event of it&#8217;s own on the MasterPage. You can&#8217;t. (unless I&#8217;m missing something). Another classic example of WebForms being too complicated for it&#8217;s own [...]]]></description>
			<content:encoded><![CDATA[<p>Today I spent a long time trying to add a control to the Page.Controls collection from a MasterPage. Short version: without writing a(nother) IHttpModule which hooks Page_PreLoad and fires off an event of it&#8217;s own on the MasterPage. You can&#8217;t. (unless I&#8217;m missing something).</p>
<p>Another classic example of WebForms being too complicated for it&#8217;s own good.</p>
<p>In other news: <a href="http://www.ayende.com/blog">Oren</a> and <a href="http://www.matshelander.com/wordpress/">Mats</a> are having a dustup over <a href="http://ayende.com/Blog/archive/2007/08/25/In-Defense-of-WebForms-Well-maybe-not.aspx">webforms</a>. I have this remarkible experence when I work with WebForms. Sometimes I get the entire model/life-cycle/event flow etc in my head and fix or work around quite complex scenarios to get some piece of functionality working.</p>
<p>e.g. Writing a control which/removes adds instances of other controls to itself when buttons are presses.</p>
<p>When this happens I experience this strange sense of achievement and even pride. The feeling that I have really done some &#8220;hardcore&#8221; programming today. Then I remember that I just managed to inject a string into the middle of another string and write the result to a stream.</p>
<p>Then I feel sad.</p>
]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2007/09/04/webforms-hurt-me-good/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>SoC in WebForms</title>
		<link>http://joshrobb.com/blog/2007/08/02/soc-in-webforms/</link>
		<comments>http://joshrobb.com/blog/2007/08/02/soc-in-webforms/#comments</comments>
		<pubDate>Thu, 02 Aug 2007 16:40:40 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[castle]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[web architecture]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/2007/08/02/soc-in-webforms/</guid>
		<description><![CDATA[Scott Bellware makes a brillant comment on Hammett&#8217;s weblog: ASP .NET templated controls did almost nothing to encourage separation of orthogonal concerns. It simply ended up separating concerns that aren’t separate concerns. Pure Genius &#8211; this summarises an entire field of criticism (e.g. [1][2]). The whole issue with the OnRowDataBound/FindControl() style of programming is that [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://codebetter.com/blogs/scott.bellware/">Scott Bellware</a> makes a <a href="http://hammett.castleproject.org/?p=183#comment-21908">brillant comment</a> on <a href="http://hammett.castleproject.org/">Hammett&#8217;s</a> weblog:</p>
<blockquote><p>ASP .NET templated controls did almost nothing to encourage separation of orthogonal concerns. It simply ended up separating concerns that aren’t separate concerns.</p></blockquote>
<p>Pure Genius &#8211; this summarises an entire field of criticism (e.g. <a href="http://www.ayende.com/Blog/archive/2007/07/23/The-Correct-Separation-Of-Concerns.aspx">[1]</a><a href="http://hammett.castleproject.org/?p=161">[2]</a>). The whole issue with the OnRowDataBound/FindControl() style of programming is that things which are fundamentally simple (iteration and string concatenation) are impossibly complex because concerns have been separated which are not orthogonal.</p>
<p>There&#8217;s an important caveat  to this &#8211; which is that WebForms is actually trying to solve a different problem from the one that I and many other developers build web apps are trying to solve. WebForms was intended to allow VB6 windows programmers to build web based apps &#8211; without having to understand HTTP, HTML, CSS, Javascript, GET/POST/HEAD etc.</p>
<p>This has actually proven to work pretty well in specific circumstances. e.g. A team of developers building an inhouse (intranet) line of business app. A good friend of mine was tasked to lead a team of 20 or so Oracle Designer developer in building a next gen version of the product they had been working on in ASP.NET 1.1. They were able to pick it up and get productive remarkably quickly because they could continue to work with a Control based, form based model that was familar to them.</p>
<p>Where it&#8217;s made life immeasurably harder is for developers who are building public facing web apps. Apps the HTML they&#8217;re actually emitting matters, where cross browser compat is something that needs to be deeply understood &#8211; not abstracted away (thats a whole &#8216;nother post).</p>
<p>The reason this is even an issue is because of the Microsoft DevDiv monoculture. If it&#8217;s a Microsoft solution then it&#8217;s obviously the best. In the Java world &#8211; there&#8217;s JSP (classic asp using Java) and JSF (roughly webforms) &#8211; but there&#8217;s a whole boatload of other solutions to problems.</p>
<p>I don&#8217;t see anyone arguing that the only right way to build web apps using java is to use JSF. People are free to examine the problems they face, look at the solutions proposed by various other people who have published their work (e.g. Tapestry, Grails, RIFE, Struts, WebWork, Struts 2 etc&#8230;) and either use an existing solution or roll their own. Same in the Python (Django, Web.py, Zope), PHP (Zend Framework, Cake, various PEAR libraries), Perl and pretty much any other community you care to examine.</p>
<p>Which tool is right for you depends entirely on your context (the problem, your experience, your team, their experience etc). If Webforms is working for you &#8211; then fantastic but it&#8217;s not the right solution for everyone.</p>
]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2007/08/02/soc-in-webforms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Server.Transfer does not run ASP.NET pipeline</title>
		<link>http://joshrobb.com/blog/2007/07/17/servertransfer-does-not-run-aspnet-pipeline/</link>
		<comments>http://joshrobb.com/blog/2007/07/17/servertransfer-does-not-run-aspnet-pipeline/#comments</comments>
		<pubDate>Tue, 17 Jul 2007 17:10:53 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/2007/07/17/servertransfer-does-not-run-aspnet-pipeline/</guid>
		<description><![CDATA[Things I&#8217;ve learnt today: One. What I&#8217;ve learnt: If you use the convenient (if old school) Server.Transfer method to render a different page to a client then you need to be aware that ASP.NET pipeline events1 will not run. You know &#8211; BeginRequest, AuthenticateRequest &#8211; unimportant things like that. Basically &#8211; nothing that happens in [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Things I&#8217;ve learnt today: </strong> One.</p>
<p><strong>What I&#8217;ve learnt: </strong>If you use the convenient (if old school) Server.Transfer method to render a different page to a client then you need to be aware that ASP.NET pipeline events<sup>1</sup> will <strong>not</strong> run. You know &#8211; BeginRequest, AuthenticateRequest &#8211; unimportant things like that.</p>
<p>Basically &#8211; nothing that happens in Global.asax, HttpModules etc&#8230; will happen for this page.</p>
<p>This caused a rather embarrassing scenario for me.</p>
<p>If you requested a page which did not exist &#8211; then I Server.Transfer&#8217;ed you to a 404.aspx page.</p>
<p>At the time this seemed like good <abbr title="Separation of Concerns">SOC</abbr> &#8211; I can have a whole page which takes care of setting the correct HTTP status code, taking care of common misses etc. without issuing a redirect &#8211; which would mean you lost the url in your browser. (Something that asp.net does way to much for my tastes &#8211; but thats a whole &#8216;nother post).</p>
<p>Problem is that &#8211; the HttpModule I have which hooks up the correct &#8220;skin&#8221; for that customer based on the host header didn&#8217;t run &#8211; which meant that the user got the &#8220;default&#8221; skin &#8211; in this case another customers. <img src='http://joshrobb.com/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Anyway &#8211; it&#8217;s all fixed now &#8211; but I&#8217;ve had to duplicate the code to hook up the correct skin in two places. Which is not so hot.</p>
<p>ASP.NET is so cool. I want to have it&#8217;s children. NOT. Seriously &#8211; who wrote this &#8211; what were they thinking?</p>
<blockquote><p>Oh &#8211; we have a special case &#8211; well &#8211; we&#8217;ll re-implement some aspects of the whole fricking pipeline again to take care of this!</p></blockquote>
<p>ARRRGGG!!!!</p>
<ol class="footnotes"><li id="footnote_0_27" class="footnote">http://msdn2.microsoft.com/en-us/library/ms178473.aspx</li></ol>]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2007/07/17/servertransfer-does-not-run-aspnet-pipeline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BackgroundMotion code == Great</title>
		<link>http://joshrobb.com/blog/2007/07/05/backgroundmotion-code-great/</link>
		<comments>http://joshrobb.com/blog/2007/07/05/backgroundmotion-code-great/#comments</comments>
		<pubDate>Thu, 05 Jul 2007 08:00:00 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[asp.net]]></category>
		<category><![CDATA[web architecture]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/1999/11/30/backgroundmotion-code-great/</guid>
		<description><![CDATA[Note: This is a review of the recently release BackgroundMotion source code and developer guidance. Full disclosure – I used to work with Jeremy and consider him a friend. I finally made some time today to sit down and browse through the source code for BackgroundMotion. For those of you who haven&#8217;t come across this [...]]]></description>
			<content:encoded><![CDATA[<p><em>Note: This is a review of the recently release BackgroundMotion source code and developer guidance. Full disclosure – I used to work with Jeremy and consider him a friend.<br />
</em></p>
<p>I finally made some time today to sit down and browse through the source code for <a href="http://backgroundmotion.com">BackgroundMotion</a>. For those of you who haven&#8217;t come across this project &#8211; it&#8217;s kind of a best practices sample built by the great guys at <a href="http://www.mindscape.co.nz">Mindscape</a>. Background motion is a Web2.0, AJAXified, community driven site for submitting videos for use with <a href="http://windowsultimate.com/blogs/extras/archive/2007/03/14/windows-dreamscene.aspx">Windows Vista Dreamscene</a> (the use a video as your background rather than just an image thingy). It&#8217;s pretty buzzword compliant &#8211; it&#8217;s got tags, AJAX and user generated content. On the backend it uses ASP.NET AJAX, LINQ to SQL, the Web Client Software factory, MVP, Unit testing and all sorts of other goodies.</p>
<p>Unlike lots of the samples and guidance coming from the P&amp;P team &#8211; this one is also a real functioning LIVE application. Rather than just completing something to the degree necessary to show the main concepts &#8211; this is a pretty finished piece of work. Well &#8211; production ready at least &#8211; what software is ever &#8220;finished&#8221;?</p>
<p>It&#8217;s also a great resource for looking at structuring a real world application using the full Microsoft .NET 3.5 stack. There are heaps of great ideas in there including:</p>
<ul>
<li>Echoes of discussions in <a href="http://jimmynilsson.com/blog/">Jimmy Nilsson&#8217;s</a> book <a href="http://www.amazon.co.uk/exec/obidos/ASIN/0321268202/">Applying Domain-Driven Design and Patterns: Using .Net</a></li>
<li>Implementations of UnitOfWork , Repository&lt;T&gt; + Repository Specialization  very similar to  <a href="http://www.ayende.com">Oren&#8217;s</a> <a href="http://rhino-tools.svn.sourceforge.net/viewvc/rhino-tools/trunk/SampleApplications/Exesto/">Exesto sample</a> + <a href="http://sourceforge.net/projects/rhino-tools">Rhino Tools</a></li>
<li>A declarative .net DataBinding Extender control similar to the ones in <a href="http://www.springframework.net/doc-latest/reference/html/web.html">Spring.Net</a>, the <a href="http://castleproject.org/monorail/">MonoRail</a> <a href="http://svn.castleproject.org:8080/svn/castle/trunk/MonoRail/TestSite/views/binding/DataBound.aspx">WebForms View Engine</a> and <a href="http://www.west-wind.com/">Rick Strahl&#8217;s </a><a href="http://msdn.microsoft.com/msdnmag/issues/06/12/ExtendASPNET/default.aspx?loc=en">wwDataBinder</a></li>
</ul>
<p>There are also <a href="http://backgroundmotion.com/DeveloperGuide.aspx">short videos</a> from the guys giving an overview of some of the technology/patterns and choices that they&#8217;ve used. I particularly liked the great discussion of <a href="http://backgroundmotion.com/Learn/ModelViewPresenter.aspx">MVP with WebForms</a>.</p>
<p>One minor criticism: I remember chatting with <a href="http://www.turtle.net.nz">Jeremy</a> about the <a href="http://www.codeplex.com/websf/Wiki/View.aspx?title=Composite%20Web%20Application%20Block">Composite Web Application Block</a> when it was released and complaining that after downloading it, reading the docs and source – I couldn&#8217;t figure out how to use it. His answer at the time was: Wait until we release the BackgroundMotion source – then you&#8217;ll have a real example. Well – I&#8217;ve looked through the code – and I still have no idea how the CWAB really adds value. Even after watching the <a href="http://backgroundmotion.com/Learn/PlayVideo.aspx?v=Nugget2">video</a> and reading the <a href="http://backgroundmotion.com/Learn/WebClientSoftwareFactory.aspx">Web Client Software Factory page</a> – I&#8217;m clueless. Maybe I&#8217;m just not smart enough to get it.</p>
]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2007/07/05/backgroundmotion-code-great/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>You know you’re having a bad day when&#8230;</title>
		<link>http://joshrobb.com/blog/2007/06/28/you-know-you%e2%80%99re-having-a-bad-day-when/</link>
		<comments>http://joshrobb.com/blog/2007/06/28/you-know-you%e2%80%99re-having-a-bad-day-when/#comments</comments>
		<pubDate>Thu, 28 Jun 2007 17:02:14 +0000</pubDate>
		<dc:creator>josh</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[iis]]></category>

		<guid isPermaLink="false">http://joshrobb.com/blog/2007/06/28/you-know-you%e2%80%99re-having-a-bad-day-when/</guid>
		<description><![CDATA[You walk into the office and get told that you need to drop everything you were going to be working on because there&#8217;s a recurring problem on the production servers. For the last few days we&#8217;ve been experiencing a 100% CPU utilization on the w3wp.exe (the asp.net worker) process. Killing it off will fix the [...]]]></description>
			<content:encoded><![CDATA[<p>You walk into the office and get told that you need to drop everything you were going to be working on because there&#8217;s a recurring problem on the production servers. For the last few days we&#8217;ve been experiencing a 100% CPU utilization on the w3wp.exe (the asp.net worker) process. Killing it off will fix the problem temporarily &#8211; but it will start up again sooner or later. Time to start production debugging!</p>
<ol>
<li>Install the <a href="http://www.microsoft.com/whdc/devtools/debugging/default.mspx">Debugging Tools for Windows</a> and thank the good Lord you&#8217;ve been reading <a href="http://blogs.msdn.com/tess/">Tess&#8217;s blog</a>.</li>
<li>Create a &#8220;hang&#8221; dump of the process.
<p style="text-align: justify"><span style="font-family: Courier">&gt; adplus -hang -p 1680<br />
</span></li>
<li> Open the dump in windbg.exe
<p style="text-align: justify"><span style="font-family: Courier">&gt;windbg.exe -z Hang_Mode__Date_06-28-2007__Time_11-21-2020<br />
</span></li>
<li>Load <a href="http://msdn2.microsoft.com/en-us/library/ms404370(VS.80).aspx">sos.dll</a> &#8211; the debug helper for the CLR.
<p style="text-align: justify"><span style="font-family: Courier">&gt; .load C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\sos.dll<br />
</span></li>
<li>Checkout what&#8217;s happening in the CLR thread pool.
<p><span style="font-family: Courier">0:000&gt; !threadpool<br />
CPU utilization 100%<br />
Worker Thread: Total: 3 Running: 2 Idle: 1 MaxLimit: 200 MinLimit: 2<br />
Work Request in Queue: 0<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
Number of Timers: 9<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
Completion Port Thread:Total: 2 Free: 1 MaxFree: 4 CurrentLimit: 2 MaxLimit: 200 MinLimit: 2<br />
</span></li>
<li>There are two CLR threads running. Wonder what they&#8217;re doing? Are they GC&#8217;ing or in user code? Let&#8217;s take a look at what&#8217;s happening with the OS threads.
<p><span style="font-family: Courier">0:000&gt; !threads<br />
ThreadCount: 8<br />
UnstartedThread: 0<br />
BackgroundThread: 8<br />
PendingThread: 0<br />
DeadThread: 0<br />
Hosted Runtime: no<br />
PreEmptive GC Alloc Lock<br />
ID OSID ThreadOBJ State GC Context Domain Count APT Exception<br />
13 1 90c 000dc6e8 1808220 Enabled 02b64538:02b65458 000d9710 0 Ukn (Threadpool Worker)<br />
17 2 fdc 000e2fc8 b220 Enabled 00000000:00000000 000d9710 0 MTA (Finalizer)<br />
18 3 38c 000f7798 80a220 Enabled 00000000:00000000 000d9710 0 MTA (Threadpool Completion Port)<br />
19 4 84c 000fa800 1220 Enabled 00000000:00000000 000d9710 0 Ukn<br />
11 5 cd0 00116b30 880a220 Enabled 00000000:00000000 000d9710 0 MTA (Threadpool Completion Port)<br />
<strong>21 6 e94 0ebd6bc8 180b220 Disabled 00000000:00000000 000fb1a0 1 MTA (Threadpool Worker)<br />
22 8 b70 0ebde1a8 180b220 Disabled 00000000:00000000 000fb1a0 1 MTA (Threadpool Worker)</strong><br />
23 7 e14 0ec0a378 880b220 Enabled 00000000:00000000 000d9710 0 MTA (Threadpool Completion Port)<br />
</span></li>
<li>There&#8217;s two threads running user code there &#8211; are they the ones that are pegging the CPU? Let&#8217;s see.
<p><span style="font-family: Courier">0:000&gt; !runaway<br />
User Mode Time<br />
Thread Time<br />
<strong>21:e94 0 days 0:19:50.296<br />
22:b70 0 days 0:15:38.625</strong><br />
13:90c 0 days 0:00:07.062<br />
15:934 0 days 0:00:00.156<br />
16:a38 0 days 0:00:00.140<br />
3:bec 0 days 0:00:00.062<br />
5:538 0 days 0:00:00.046<br />
0:2e0 0 days 0:00:00.046<br />
28:6f0 0 days 0:00:00.000<br />
27:a3c 0 days 0:00:00.000<br />
26:530 0 days 0:00:00.000<br />
25:358 0 days 0:00:00.000<br />
24:b8c 0 days 0:00:00.000<br />
23:e14 0 days 0:00:00.000<br />
20:9e8 0 days 0:00:00.000<br />
19:84c 0 days 0:00:00.000<br />
18:38c 0 days 0:00:00.000<br />
17:fdc 0 days 0:00:00.000<br />
14:5d4 0 days 0:00:00.000<br />
12:ab8 0 days 0:00:00.000<br />
11:cd0 0 days 0:00:00.000<br />
10:f1c 0 days 0:00:00.000<br />
9:ac4 0 days 0:00:00.000<br />
8:a40 0 days 0:00:00.000<br />
7:a24 0 days 0:00:00.000<br />
6:c84 0 days 0:00:00.000<br />
4:f94 0 days 0:00:00.000<br />
2:bb0 0 days 0:00:00.000<br />
1:270 0 days 0:00:00.000<br />
</span></li>
<li>Yep &#8211; the two CLR threads are chewing all the CPU. Let&#8217;s switch our thread context to the first one. (21).
<p><span style="font-family: Courier">0:006&gt; ~21 s<br />
eax=026bcd88 ebx=026bcd01 ecx=026bcd88 edx=02702a44 esi=026bcd88 edi=026bf064<br />
eip=0ee0709e esp=0eeff1ec ebp=026bcd88 iopl=0 nv up ei ng nz na pe cy<br />
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000287<br />
Demo!Models.CMSPage.IsSubPage(Models.CMSPage)+0&#215;56:<br />
0ee0709e 0fb6db movzx ebx,bl<br />
</span></li>
<li>Let&#8217;s take a look at what managed objects are reachable from the current stack.
<p><span style="font-family: Courier">0:021&gt; !dso<br />
OS Thread Id: 0xe94 (21)<br />
ESP/REG Object Name<br />
<strong>eax 026bcd88 Models.CMSPage<br />
ecx 026bcd88 Models.CMSPage<br />
esi 026bcd88 Models.CMSPage<br />
edi 026bf064 Models.CMSPage<br />
ebp 026bcd88 Models.CMSPage<br />
0eeff1f8 026bcd88 Models.CMSPage<br />
</strong>0eeff1fc 026bf064 Models.CMSPage<br />
0eeff208 06529858 System.String &lt;ul id=&#8221;menu-level{0}&#8221;&gt;<br />
0eeff238 026cd1cc System.Object[] (Models.CMSPage[])<br />
0eeff240 790d6584 System.String<br />
0eeff244 026b906c ASP.skins_demo_master_master<br />
0eeff284 026b906c ASP.skins_demo_master_master<br />
0eeff28c 026bdea4 System.Text.StringBuilder<br />
0eeff29c 026cd1cc System.Object[] (Models.CMSPage[])<br />
0eeff2a0 026bdea4 System.Text.StringBuilder<br />
0eeff2a4 026cd1cc System.Object[] (Models.CMSPage[])<br />
0eeff2a8 026bcd88 Models.CMSPage<br />
0eeff2b8 026b906c ASP.skins_demo_master_master<br />
0eeff2bc 026bdd2c System.Web.UI.HtmlControls.HtmlLink<br />
0eeff2cc 026df978 System.Object<br />
0eeff2d0 024af58c System.String class<br />
0eeff2dc 0651f798 System.String screen.css<br />
0eeff2f8 026b906c ASP.skins_demo_master_master<br />
0eeff310 024a793c System.EventArgs<br />
0eeff33c 026b906c ASP.skins_demo_master_master<br />
0eeff350 026b4bdc ASP.default_aspx<br />
0eeff374 790d6584 System.String<br />
0eeff37c 026afcf4 System.Web.HttpContext<br />
0eeff380 026b4bdc ASP.default_aspx<br />
0eeff514 026b4bdc ASP.default_aspx<br />
0eeff528 026b4bdc ASP.default_aspx<br />
0eeff558 02464340 System.Globalization.CultureInfo<br />
0eeff55c 02464110 System.Globalization.CultureInfo<br />
0eeff560 025beff0 System.Threading.Thread<br />
0eeff564 026b4bdc ASP.default_aspx<br />
0eeff59c 026afcf4 System.Web.HttpContext<br />
0eeff5a0 026b4bdc ASP.default_aspx<br />
0eeff5bc 026afcf4 System.Web.HttpContext<br />
0eeff5c0 025d1084 System.Web.HttpApplication+CallHandlerExecutionStep<br />
0eeff5f8 025d1084 System.Web.HttpApplication+CallHandlerExecutionStep<br />
0eeff5fc 025beeb0 ASP.global_asax<br />
0eeff62c 025beeb0 ASP.global_asax<br />
0eeff630 026affb4 System.Web.HttpApplication+ThreadContext<br />
0eeff634 025e54a0 System.Web.AspNetSynchronizationContext<br />
0eeff63c 025beeb0 ASP.global_asax<br />
0eeff668 026aff98 System.Web.HttpAsyncResult<br />
0eeff690 026afcf4 System.Web.HttpContext<br />
0eeff694 026af6ac System.Web.Hosting.ISAPIWorkerRequestInProcForIIS6<br />
0eeff698 02477fb0 System.Web.HttpRuntime<br />
0eeff6e0 0247b8e4 System.Web.Caching.CacheSingle<br />
0eeff700 0248e4a4 System.Web.Hosting.ISAPIRuntime<br />
</span></li>
<li>Himmm.. we have the same instance (026bcd88) of that CMSPage object floating around in a bunch of places. I wonder if we have some bad data in the database. This class has a parent/child relationship with itself. Could it be causing an infinite loop?
<p><span style="font-family: Courier">0:021&gt; !do 026bcd88<br />
Name: Models.CMSPage<br />
MethodTable: 0e941234<br />
EEClass: 0244cc60<br />
Size: 92(0x5c) bytes<br />
(C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\5bf6c3da\19d72350\assembly\dl3\36150507\00d93296_9ca7c701\Demo.DLL)<br />
Fields:<br />
MT Field Offset Type VT Attr Value Name<br />
0e942118 4000140 40 &#8230;sionFactoryHolder 0 static 024c4e34 holder<br />
791036b0 4000147 4 &#8230;ections.ArrayList 0 instance 026bcde4 __validators<br />
79113dfc 4000148 8 &#8230;tions.IDictionary 0 instance 00000000 __failedProperties<br />
79124228 4000149 c System.Object[] 0 instance 00000000 _errorMessages<br />
790fed1c 40000f7 40 System.Int32 0 instance 102 _id<br />
790fa3e0 40000f8 18 System.String 0 instance 026bc668 _name<br />
790fa3e0 40000f9 1c System.String 0 instance 00000000 _url<br />
790fa3e0 40000fa 20 System.String 0 instance 026bc6a0 _title<br />
790fa3e0 40000fb 24 System.String 0 instance 026bc768 _content<br />
790fa3e0 40000fc 28 System.String 0 instance 026bc6c8 _heading<br />
790fa3e0 40000fd 2c System.String 0 instance 026bc6e4 _metaDescription<br />
790fa3e0 40000fe 30 System.String 0 instance 026bc71c _metaKeyWords<br />
0e941174 40000ff 44 System.Int32 0 instance 2 _status<br />
791059c0 4000100 10 System.Double 0 instance 1.000000 _displayOrder<br />
<strong>0e941234 4000101 34 Models.CMSPage 0 instance 026bcd88 _parent<br />
</strong>7910e274 4000102 38 &#8230;Collections.IList 0 instance 026bcef0 _children<br />
79105ef0 4000103 48 System.DateTime 1 instance 026bcdd0 _dateUpdatedAt<br />
79105ef0 4000104 50 System.DateTime 1 instance 026bcdd8 _dateCreatedAt<br />
0e94337c 4000105 3c Models.Site 0 instance 026b8e30 _Site<br />
</span></li>
<li>11. Yep &#8211; check that &#8211; the _parent field of instance 026bcd88 is pointing at itself (026bcd88). Log into the database and manually patch up the data. Next job &#8211; write some more defensive code around how that works.</li>
</ol>
<p>Well &#8211; I hope you enjoyed that. Production debugging is always fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://joshrobb.com/blog/2007/06/28/you-know-you%e2%80%99re-having-a-bad-day-when/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
