<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" 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:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Footprints in the snow of a warped mind - ASP</title>
    <link>http://blogs.thesitedoctor.co.uk/test/</link>
    <description>newtelligence powered</description>
    <language>en-us</language>
    <copyright>Tim</copyright>
    <lastBuildDate>Thu, 29 May 2008 14:32:33 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>timgaunt@gmail.com</managingEditor>
    <webMaster>timgaunt@gmail.com</webMaster>
    <item>
      <trackback:ping>http://blogs.thesitedoctor.co.uk/test/Trackback.aspx?guid=4b25e0a2-9f4e-4abf-abd2-621a7a1d848f</trackback:ping>
      <pingback:server>http://blogs.thesitedoctor.co.uk/test/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.thesitedoctor.co.uk/test/PermaLink,guid,4b25e0a2-9f4e-4abf-abd2-621a7a1d848f.aspx</pingback:target>
      <dc:creator>Tim</dc:creator>
      <wfw:comment>http://blogs.thesitedoctor.co.uk/test/CommentView,guid,4b25e0a2-9f4e-4abf-abd2-621a7a1d848f.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.thesitedoctor.co.uk/test/SyndicationService.asmx/GetEntryCommentsRss?guid=4b25e0a2-9f4e-4abf-abd2-621a7a1d848f</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.27seconds.com/">Doug Setzer</a> posted this comment in response
to my recent "<a href="http://blogs.thesitedoctor.co.uk/tim/2008/05/28/A+Seriously+Elegant+SQL+Injection.aspx">A
seriously elegant SQL Injection</a>" post and I thought it may be of interest to others
so have promoted it to a post...
</p>
        <hr />
        <p>
Well, I'll step up and say that I am the "mate" who had this done.  Tim's right
- *always* sanitize your inputs.  In my defence, this was a site that I inherited
from a previous contractor.  I'm not entirely absent of blame, I still should
have done a security sweep through the code.
</p>
        <p>
I'd like to document the steps that I went through once this was identified to try
and avoid this kind of thing in the future.
</p>
        <ol>
          <li>
Edit every web page that executes a query to sanitize any parameters that are passed
in.  Since the site was classic ASP, I used my "SQLStringFieldValue" function:<br /><a href="http://www.27seconds.com/kb/article_view.aspx?id=50">www.27seconds.com/kb/article_view.aspx?id=50</a></li>
          <li>
Modify the DB user account that is used to have *read only* access to the database 
</li>
          <li>
Modify the pages that DO write to the database to have *read/write* access to the
specific tables that are being changed.  This limits the number of places that
SQL Injection can occur to a smaller set than was previously possible.  I still
sanitize all of my input, but I'm extra spastic in these database calls. 
</li>
          <li>
Add database auditing (triggers writing to mirror tables with audit event indicator
&amp; date/time) to see when data changes occur.  This is still problematic with
the pages that have "write" permissions to the tables, but again- that footprint is
much smaller.</li>
        </ol>
        <ol>
My future plans are to move to a view/stored procedure based architecture.  I
can then limit write permissions to just the stored procedures and read permissions
to just the views.  My grand gusto plans are to move to using command objects
&amp; parameters, but I'd sooner re-write the entire site.
</ol>
        <hr />
        <p>
Although Doug's attack wasn't the same nihaorr1.com attack that's going around atm
it was similar so I would imagine other's will find this useful.
</p>
        <p>
It still amazes me how many developers still fail to sanitise strings, only last week
I came across another site (in PHP) that was allowing simple SQL injections to be
used to log into their administration system. It was down to a problem with the sanitization
string, but why not at least check your site before it goes live? It takes 2 minutes
and even less to fix...
</p>
        <p>
For those of you who need a few pointers, there's a good discussion or two about <a href="http://www.aspmessageboard.com/forum/asp.asp?M=896001&amp;T=896001&amp;F=20&amp;P=1#896004">sanitising
strings on the 4 Guys From Rolla site</a>.
</p>
        <img width="0" height="0" src="http://blogs.thesitedoctor.co.uk/test/aggbug.ashx?id=4b25e0a2-9f4e-4abf-abd2-621a7a1d848f" />
      </body>
      <title>A seriously elegant SQL Injection -how it was sorted</title>
      <guid isPermaLink="false">http://blogs.thesitedoctor.co.uk/test/PermaLink,guid,4b25e0a2-9f4e-4abf-abd2-621a7a1d848f.aspx</guid>
      <link>http://blogs.thesitedoctor.co.uk/test/2008/05/29/ASeriouslyElegantSQLInjectionHowItWasSorted.aspx</link>
      <pubDate>Thu, 29 May 2008 14:32:33 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.27seconds.com/"&gt;Doug Setzer&lt;/a&gt; posted this comment in response
to my recent "&lt;a href="http://blogs.thesitedoctor.co.uk/tim/2008/05/28/A+Seriously+Elegant+SQL+Injection.aspx"&gt;A
seriously elegant SQL Injection&lt;/a&gt;" post and I thought it may be of interest to others
so have promoted it to a post...
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
Well, I'll step up and say that I am the "mate" who had this done.&amp;nbsp; Tim's right
- *always* sanitize your inputs.&amp;nbsp; In my defence, this was a site that I inherited
from a previous contractor.&amp;nbsp; I'm not entirely absent of blame, I still should
have done a security sweep through the code.
&lt;/p&gt;
&lt;p&gt;
I'd like to document the steps that I went through once this was identified to try
and avoid this kind of thing in the future.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Edit every web page that executes a query to sanitize any parameters that are passed
in.&amp;nbsp; Since the site was classic ASP, I used my "SQLStringFieldValue" function:&lt;br&gt;
&lt;a href="http://www.27seconds.com/kb/article_view.aspx?id=50"&gt;www.27seconds.com/kb/article_view.aspx?id=50&lt;/a&gt; 
&lt;li&gt;
Modify the DB user account that is used to have *read only* access to the database 
&lt;li&gt;
Modify the pages that DO write to the database to have *read/write* access to the
specific tables that are being changed.&amp;nbsp; This limits the number of places that
SQL Injection can occur to a smaller set than was previously possible.&amp;nbsp; I still
sanitize all of my input, but I'm extra spastic in these database calls. 
&lt;li&gt;
Add database auditing (triggers writing to mirror tables with audit event indicator
&amp;amp; date/time) to see when data changes occur.&amp;nbsp; This is still problematic with
the pages that have "write" permissions to the tables, but again- that footprint is
much smaller.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol&gt;
My future plans are to move to a view/stored procedure based architecture.&amp;nbsp; I
can then limit write permissions to just the stored procedures and read permissions
to just the views.&amp;nbsp; My grand gusto plans are to move to using command objects
&amp;amp; parameters, but I'd sooner re-write the entire site.
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;
Although Doug's attack wasn't the same nihaorr1.com attack that's going around atm
it was similar so I would imagine other's will find this useful.
&lt;/p&gt;
&lt;p&gt;
It still amazes me how many developers still fail to sanitise strings, only last week
I came across another site (in PHP) that was allowing simple SQL injections to be
used to log into their administration system. It was down to a problem with the sanitization
string, but why not at least check your site before it goes live? It takes 2 minutes
and even less to fix...
&lt;/p&gt;
&lt;p&gt;
For those of you who need a few pointers, there's a good discussion or two about &lt;a href="http://www.aspmessageboard.com/forum/asp.asp?M=896001&amp;amp;T=896001&amp;amp;F=20&amp;amp;P=1#896004"&gt;sanitising
strings on the 4 Guys From Rolla site&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.thesitedoctor.co.uk/test/aggbug.ashx?id=4b25e0a2-9f4e-4abf-abd2-621a7a1d848f" /&gt;</description>
      <comments>http://blogs.thesitedoctor.co.uk/test/CommentView,guid,4b25e0a2-9f4e-4abf-abd2-621a7a1d848f.aspx</comments>
      <category>ASP</category>
      <category>ASP.Net</category>
      <category>C#</category>
      <category>Development</category>
      <category>IIS</category>
      <category>Security</category>
      <category>SQL Server</category>
      <category>Web Development</category>
    </item>
    <item>
      <trackback:ping>http://blogs.thesitedoctor.co.uk/test/Trackback.aspx?guid=3acf5fd8-3644-4944-a1d0-4928c79abd96</trackback:ping>
      <pingback:server>http://blogs.thesitedoctor.co.uk/test/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.thesitedoctor.co.uk/test/PermaLink,guid,3acf5fd8-3644-4944-a1d0-4928c79abd96.aspx</pingback:target>
      <dc:creator>Tim</dc:creator>
      <wfw:comment>http://blogs.thesitedoctor.co.uk/test/CommentView,guid,3acf5fd8-3644-4944-a1d0-4928c79abd96.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.thesitedoctor.co.uk/test/SyndicationService.asmx/GetEntryCommentsRss?guid=3acf5fd8-3644-4944-a1d0-4928c79abd96</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Another post from <span class="vcard"><a href="http://www.27seconds.com/" rel="friend" class="url n fn"><span class="givenname">Doug</span><span class="family-name">Setzer</span></a></span> from <a href="http://www.27Seconds.com/">27Seconds.com</a> :) 
</p>
        <hr />
        <p>
At my "day job", the systems guys are building new Windows 2003 servers
to upgrade our aging Windows 2000 servers.  The plan is to:<br />
 - Build the new Windows 2003 server<br />
 - Install IIS<br />
 - Install .NET<br />
 - Run the IIS migration tool from the old Win2k server
</p>
        <p>
That all went as well as could go - little things got mixed up and had to be corrected. 
But, the server would let you request plain HTML files and ASPX files, but classic
ASP pages were returned blank.  In poking around Google and the server, we came
to find that we had to enable ASP content via: 
<br />
 - IIS Manager<br />
 - Web Services Extensions<br />
 - Specifically allow Active Server Pages
</p>
        <p>
But, we were still having the same issues.  Stopping and restarting IIS didn't
help. Nor did a server reboot.
</p>
        <p>
I found a blog post that mentioned checking that the ASP ISAPI has the correct path. 
It tried a random thought that Microsoft has changed the default name of the "Windows"/"Winnt"
folder -- Windows NT4, 2000, etc. all use "Winnt", where as Windows 2003
uses the "Windows" folder.  Sure enough, double checking the path to
the ASP ISAPI had the wrong path and fixing this path fixed our issues with classic
ASP files. 
</p>
        <img width="0" height="0" src="http://blogs.thesitedoctor.co.uk/test/aggbug.ashx?id=3acf5fd8-3644-4944-a1d0-4928c79abd96" />
      </body>
      <title>ASP not running on Windows 2003 with ASP.Net installed</title>
      <guid isPermaLink="false">http://blogs.thesitedoctor.co.uk/test/PermaLink,guid,3acf5fd8-3644-4944-a1d0-4928c79abd96.aspx</guid>
      <link>http://blogs.thesitedoctor.co.uk/test/2007/03/12/ASPNotRunningOnWindows2003WithASPNetInstalled.aspx</link>
      <pubDate>Mon, 12 Mar 2007 10:49:09 GMT</pubDate>
      <description>&lt;p&gt;
Another post from &lt;span class="vcard"&gt;&lt;a href="http://www.27seconds.com/" rel="friend" class="url n fn"&gt;&lt;span class="givenname"&gt;Doug&lt;/span&gt; &lt;span class="family-name"&gt;Setzer&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; from &lt;a href="http://www.27Seconds.com/"&gt;27Seconds.com&lt;/a&gt; :) 
&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;
At my &amp;quot;day job&amp;quot;, the systems guys are building new Windows 2003 servers
to upgrade our aging Windows 2000 servers.&amp;nbsp; The plan is to:&lt;br /&gt;
&amp;nbsp;- Build the new Windows 2003 server&lt;br /&gt;
&amp;nbsp;- Install IIS&lt;br /&gt;
&amp;nbsp;- Install .NET&lt;br /&gt;
&amp;nbsp;- Run the IIS migration tool from the old Win2k server
&lt;/p&gt;
&lt;p&gt;
That all went as well as could go - little things got mixed up and had to be corrected.&amp;nbsp;
But, the server would let you request plain HTML files and ASPX files, but classic
ASP pages were returned blank.&amp;nbsp; In poking around Google and the server, we came
to find that we had to enable ASP content via: 
&lt;br /&gt;
&amp;nbsp;- IIS Manager&lt;br /&gt;
&amp;nbsp;- Web Services Extensions&lt;br /&gt;
&amp;nbsp;- Specifically allow Active Server Pages
&lt;/p&gt;
&lt;p&gt;
But, we were still having the same issues.&amp;nbsp; Stopping and restarting IIS didn't
help. Nor did a server reboot.
&lt;/p&gt;
&lt;p&gt;
I found a blog post that mentioned checking that the ASP ISAPI has the correct path.&amp;nbsp;
It tried a random thought that Microsoft has changed the default name of the &amp;quot;Windows&amp;quot;/&amp;quot;Winnt&amp;quot;
folder -- Windows NT4, 2000, etc. all use &amp;quot;Winnt&amp;quot;, where as Windows 2003
uses the &amp;quot;Windows&amp;quot; folder.&amp;nbsp; Sure enough, double checking the path to
the ASP ISAPI had the wrong path and fixing this path fixed our issues with classic
ASP files. 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.thesitedoctor.co.uk/test/aggbug.ashx?id=3acf5fd8-3644-4944-a1d0-4928c79abd96" /&gt;</description>
      <comments>http://blogs.thesitedoctor.co.uk/test/CommentView,guid,3acf5fd8-3644-4944-a1d0-4928c79abd96.aspx</comments>
      <category>ASP</category>
      <category>ASP.Net</category>
      <category>IIS</category>
      <category>Web Development</category>
    </item>
    <item>
      <trackback:ping>http://blogs.thesitedoctor.co.uk/test/Trackback.aspx?guid=6f523ed9-719c-4561-b579-f85324401c39</trackback:ping>
      <pingback:server>http://blogs.thesitedoctor.co.uk/test/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.thesitedoctor.co.uk/test/PermaLink,guid,6f523ed9-719c-4561-b579-f85324401c39.aspx</pingback:target>
      <dc:creator>Tim</dc:creator>
      <wfw:comment>http://blogs.thesitedoctor.co.uk/test/CommentView,guid,6f523ed9-719c-4561-b579-f85324401c39.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.thesitedoctor.co.uk/test/SyndicationService.asmx/GetEntryCommentsRss?guid=6f523ed9-719c-4561-b579-f85324401c39</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Thanks to <a href="http://www.27seconds.com/">Doug Setzer</a> from <a href="http://www.27seconds.com/">27
Seconds Inc</a> for these thoughts, he doesn’t blog (yet) so thought I would be interested
in posting it –not sure why as it would seem he’s my only reader…!
</p>
        <p>
I tend to agree with Doug on this one, I remember seeing <a href="http://www.codesmithtools.com/">Code
Smith</a> in action at a previous <a href="http://developerday.co.uk/ddd/">Developer
Developer Developer day</a> and although it does look, I have similar concerns as
Doug, IMSHO I'm concerned it makes the developer lazy and forget his roots. IIRC many
generators offer the ability to make your own templates but again, by doing so, how
much time do you really save? 
</p>
        <p>
Not being a code generator user* I’m also somewhat biased but I’d be interested to
hear other peoples thoughts.
</p>
        <p>
Tim
</p>
        <p>
*That said, I do have a number of “tools” that I user to generate the repetitive code
but these mainly rotate around Excel and are specific to my coding methods.
</p>
        <hr />
        <p>
The decision to use code generators is a long and tricky decision.  I'll
admit from the start, my slant on code-generation tools is against them.
</p>
        <p>
For one of my other clients, I use a simple code generation application that they
provided to me (the guy wrote it).  It does a decent job and for their coding
style, it works out fairly well.  It takes a very simplistic template and can
output (to an extent) customizable code.
</p>
        <p>
The problem that I have with all code generation tools is your ability to make changes. 
Very rarely do you know all of the data, or the extents of repeating data, or the
nuances of the code that you have to develop.  So - how does the application
handle changes?  In my case and this (very) simplistic code generation tool -
plain and simple, it doesn't.  I have to hand-code changes (.NET, ASP.NET and
database procedures).
</p>
        <p>
And the last thing - the nuances of the code that you have to develop.  How well
does a generic tool handle special situations?  Again, I know a free/custom-built
tool is a far cry from a $500/$2000 tool - but, anything that is outside of a simple
CRUD/1-table procedure and again, I'm hand-coding.  I can honestly say, 50% of
what I'm doing is "special" and doesn't fit into cookie-cutter boxes.
</p>
        <p>
The code generator that my customer gave me did exactly that - it generated code for
a database.  It was up to me to build the pages and it just gave me an easy database
access API.  I like this more than tools like <a href="http://www.ironspeed.com/">Iron
Speed</a> because nothing is being done "for" me, I can control the code it outputs
and nothing, nothing is "behind the scenes".  With <a href="http://www.ironspeed.com/">Iron
Speed</a>, they're doing a LOT "for" you.  My fear is what happens if it breaks? 
Who do you call?  Where do you look?  And, the purist in me - what does
their code really look like?  Are they doing poor-design things that ultimately
give you performance woes?
</p>
        <p>
Unfortunately, with tools such as this <a href="http://www.ironspeed.com/">Iron Speed</a> -
the only way to know if it'll work for you is to make the plunge, spend the $500 for
the pro. version and see how it goes.  You can help get yourself a glimpse, looking
under the covers by downloading the trial and putting together some little apps in
a month.  And, I see that they have a public support forum:<br /><a title="blocked::http://sjc.ironspeed.com/tool/mb/ironspeed" href="http://sjc.ironspeed.com/tool/mb/ironspeed">http://sjc.ironspeed.com/tool/mb/ironspeed</a></p>
        <p>
See what people are saying they love? what they hate? etc.
</p>
        <p>
And, of course - Google is our best friend:<br /><a href="http://www.adtmag.com/article.aspx?id=8421">http://www.adtmag.com/article.aspx?id=8421</a><br /><a title="blocked::http://www.developerreviewed.com/ironspeedreview.htm" href="http://www.developerreviewed.com/ironspeedreview.htm">http://www.developerreviewed.com/ironspeedreview.htm</a><br /><a title="blocked::http://www.angrycoder.com/article.aspx?cid=10&amp;y=2003&amp;m=6&amp;d=8" href="http://www.angrycoder.com/article.aspx?cid=10&amp;y=2003&amp;m=6&amp;d=8">http://www.angrycoder.com/article.aspx?cid=10&amp;y=2003&amp;m=6&amp;d=8</a><br /><a title="blocked::http://aspadvice.com/blogs/ssmith/archive/2006/04/26/IronSpeed-and-My-Custom-Reports-App.aspx" href="http://aspadvice.com/blogs/ssmith/archive/2006/04/26/IronSpeed-and-My-Custom-Reports-App.aspx">http://aspadvice.com/blogs/ssmith/archive/2006/04/26/IronSpeed-and-My-Custom-Reports-App.aspx</a><br /><a title="blocked::http://www.411asp.net/func/review?tree=411asp/software/aspcodee&amp;id=5642310&amp;rid" href="http://www.411asp.net/func/review?tree=411asp/software/aspcodee&amp;id=5642310&amp;rid">http://www.411asp.net/func/review?tree=411asp/software/aspcodee&amp;id=5642310&amp;rid</a>=
</p>
        <p>
I hope this helps - it's a lot to digest, but generally what I'm seeing is that
it's good for small/simple apps.
</p>
        <p>
-Doug
</p>
        <img width="0" height="0" src="http://blogs.thesitedoctor.co.uk/test/aggbug.ashx?id=6f523ed9-719c-4561-b579-f85324401c39" />
      </body>
      <title>Doug Setzer on Iron Speed / Code Generators</title>
      <guid isPermaLink="false">http://blogs.thesitedoctor.co.uk/test/PermaLink,guid,6f523ed9-719c-4561-b579-f85324401c39.aspx</guid>
      <link>http://blogs.thesitedoctor.co.uk/test/2006/12/14/DougSetzerOnIronSpeedCodeGenerators.aspx</link>
      <pubDate>Thu, 14 Dec 2006 11:14:09 GMT</pubDate>
      <description>&lt;p&gt;
Thanks to &lt;a href="http://www.27seconds.com/"&gt;Doug Setzer&lt;/a&gt; from &lt;a href="http://www.27seconds.com/"&gt;27
Seconds Inc&lt;/a&gt; for these thoughts, he doesn’t blog (yet) so thought I would be interested
in posting it –not sure why as it would seem he’s my only reader…!
&lt;/p&gt;
&lt;p&gt;
I tend to agree with Doug on this one, I remember seeing &lt;a href="http://www.codesmithtools.com/"&gt;Code
Smith&lt;/a&gt; in action at a previous &lt;a href="http://developerday.co.uk/ddd/"&gt;Developer
Developer Developer day&lt;/a&gt; and although it does look, I have similar concerns as
Doug, IMSHO I'm concerned it makes the developer lazy and forget his roots. IIRC many
generators offer the ability to make your own templates but again, by doing so, how
much time do you really save? 
&lt;/p&gt;
&lt;p&gt;
Not being a code generator user* I’m also somewhat biased but I’d be interested to
hear other peoples thoughts.
&lt;/p&gt;
&lt;p&gt;
Tim
&lt;/p&gt;
&lt;p&gt;
*That said, I do have a number of “tools” that I user to generate the repetitive code
but these mainly rotate around Excel and are specific to my coding methods.
&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;
The decision to use code generators is&amp;nbsp;a long and tricky decision.&amp;nbsp; I'll
admit from the start, my slant on code-generation tools is against them.
&lt;/p&gt;
&lt;p&gt;
For one of my other clients, I use a simple code generation application that they
provided to me (the guy wrote it).&amp;nbsp; It does a decent job and for their coding
style, it works out fairly well.&amp;nbsp; It takes a very simplistic template and can
output (to an extent) customizable code.
&lt;/p&gt;
&lt;p&gt;
The problem that I have with all code generation tools is your ability to make changes.&amp;nbsp;
Very rarely do you know all of the data, or the extents of repeating data, or the
nuances of the code that you have to develop.&amp;nbsp; So - how does the application
handle changes?&amp;nbsp; In my case and this (very) simplistic code generation tool -
plain and simple, it doesn't.&amp;nbsp; I have to hand-code changes (.NET, ASP.NET and
database procedures).
&lt;/p&gt;
&lt;p&gt;
And the last thing - the nuances of the code that you have to develop.&amp;nbsp; How well
does a generic tool handle special situations?&amp;nbsp; Again, I know a free/custom-built
tool is a far cry from a $500/$2000 tool - but, anything that is outside of a simple
CRUD/1-table procedure and again, I'm hand-coding.&amp;nbsp; I can honestly say, 50% of
what I'm doing is "special" and doesn't fit into cookie-cutter boxes.
&lt;/p&gt;
&lt;p&gt;
The code generator that my customer gave me did exactly that - it generated code for
a database.&amp;nbsp; It was up to me to build the pages and it just gave me an easy database
access API.&amp;nbsp; I like this more than tools like &lt;a href="http://www.ironspeed.com/"&gt;Iron
Speed&lt;/a&gt; because nothing is being done "for" me, I can control the code it outputs
and nothing, nothing is "behind the scenes".&amp;nbsp; With &lt;a href="http://www.ironspeed.com/"&gt;Iron
Speed&lt;/a&gt;, they're doing a LOT "for" you.&amp;nbsp; My fear is what happens if it breaks?&amp;nbsp;
Who do you call?&amp;nbsp; Where do you look?&amp;nbsp; And, the purist in me - what does
their code really look like?&amp;nbsp; Are they doing poor-design things that ultimately
give you performance woes?
&lt;/p&gt;
&lt;p&gt;
Unfortunately, with tools such as this &lt;a href="http://www.ironspeed.com/"&gt;Iron Speed&lt;/a&gt; -
the only way to know if it'll work for you is to make the plunge, spend the $500 for
the pro. version and see how it goes.&amp;nbsp; You can help get yourself a glimpse, looking
under the covers by downloading the trial and putting together some little apps in
a month.&amp;nbsp; And, I see that they have a public support forum:&lt;br&gt;
&lt;a title=blocked::http://sjc.ironspeed.com/tool/mb/ironspeed href="http://sjc.ironspeed.com/tool/mb/ironspeed"&gt;http://sjc.ironspeed.com/tool/mb/ironspeed&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
See what people are saying they love? what they hate? etc.
&lt;/p&gt;
&lt;p&gt;
And, of course - Google is our best friend:&lt;br&gt;
&lt;a href="http://www.adtmag.com/article.aspx?id=8421"&gt;http://www.adtmag.com/article.aspx?id=8421&lt;/a&gt;
&lt;br&gt;
&lt;a title=blocked::http://www.developerreviewed.com/ironspeedreview.htm href="http://www.developerreviewed.com/ironspeedreview.htm"&gt;http://www.developerreviewed.com/ironspeedreview.htm&lt;/a&gt;
&lt;br&gt;
&lt;a title=blocked::http://www.angrycoder.com/article.aspx?cid=10&amp;amp;y=2003&amp;amp;m=6&amp;amp;d=8 href="http://www.angrycoder.com/article.aspx?cid=10&amp;amp;y=2003&amp;amp;m=6&amp;amp;d=8"&gt;http://www.angrycoder.com/article.aspx?cid=10&amp;amp;y=2003&amp;amp;m=6&amp;amp;d=8&lt;/a&gt;
&lt;br&gt;
&lt;a title=blocked::http://aspadvice.com/blogs/ssmith/archive/2006/04/26/IronSpeed-and-My-Custom-Reports-App.aspx href="http://aspadvice.com/blogs/ssmith/archive/2006/04/26/IronSpeed-and-My-Custom-Reports-App.aspx"&gt;http://aspadvice.com/blogs/ssmith/archive/2006/04/26/IronSpeed-and-My-Custom-Reports-App.aspx&lt;/a&gt;
&lt;br&gt;
&lt;a title=blocked::http://www.411asp.net/func/review?tree=411asp/software/aspcodee&amp;amp;id=5642310&amp;amp;rid href="http://www.411asp.net/func/review?tree=411asp/software/aspcodee&amp;amp;id=5642310&amp;amp;rid"&gt;http://www.411asp.net/func/review?tree=411asp/software/aspcodee&amp;amp;id=5642310&amp;amp;rid&lt;/a&gt;=
&lt;/p&gt;
&lt;p&gt;
I hope this helps&amp;nbsp;- it's a lot to digest, but generally what I'm seeing is that
it's good for small/simple apps.
&lt;/p&gt;
&lt;p&gt;
-Doug
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.thesitedoctor.co.uk/test/aggbug.ashx?id=6f523ed9-719c-4561-b579-f85324401c39" /&gt;</description>
      <comments>http://blogs.thesitedoctor.co.uk/test/CommentView,guid,6f523ed9-719c-4561-b579-f85324401c39.aspx</comments>
      <category>ASP</category>
      <category>ASP.Net</category>
      <category>Business</category>
    </item>
    <item>
      <trackback:ping>http://blogs.thesitedoctor.co.uk/test/Trackback.aspx?guid=27138caa-da1d-478b-a09a-474206111338</trackback:ping>
      <pingback:server>http://blogs.thesitedoctor.co.uk/test/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.thesitedoctor.co.uk/test/PermaLink,guid,27138caa-da1d-478b-a09a-474206111338.aspx</pingback:target>
      <dc:creator>Tim</dc:creator>
      <wfw:comment>http://blogs.thesitedoctor.co.uk/test/CommentView,guid,27138caa-da1d-478b-a09a-474206111338.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.thesitedoctor.co.uk/test/SyndicationService.asmx/GetEntryCommentsRss?guid=27138caa-da1d-478b-a09a-474206111338</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We're nearing the end of a large system for the lovely people over at <a href="http://www.consol.co.uk/">Consolidated
Communications Management Ltd</a> and we've just come across a nice idea to make sense
of database responses. Typically in the past we've simply returned -1/0 for failure
and a positive integer (usually an id) of it was successful. The new method should
add a little more conformity to our code. We already use a common Database Access
Layer which handles the opening/closing of our connection, adding parameters etc but
I’ve just added an enum with the common database responses, thought it may be of use
to others:
</p>
        <div class="code">
          <img src="/img/sc/clear.gif" align="top" />
          <span style="color: rgb(0, 0, 255);">public enum</span> DatabaseResponse<br /><div style="display: none;" id="closed632990474472708750_2"><img src="/img/sc/PlusNoLines.gif" onclick="open632990474472708750_2.style.display='block'; closed632990474472708750_2.style.display='none'; " align="top" /><b><span style="color: rgb(0, 0, 139);">{...}</span></b></div><div style="display: block;" id="open632990474472708750_2"><img src="/img/sc/minusNoTopLine.gif" onclick="open632990474472708750_2.style.display='none'; closed632990474472708750_2.style.display='block'; " align="top" />{<br /><img src="/img/sc/I.gif" align="top" />    Success = <span style="color: rgb(0, 128, 128);">0</span>,<br /><img src="/img/sc/I.gif" align="top" />    Init = -<span style="color: rgb(0, 128, 128);">1</span>,<br /><img src="/img/sc/I.gif" align="top" />    Found = -<span style="color: rgb(0, 128, 128);">2</span>,<br /><img src="/img/sc/I.gif" align="top" />    NotFound = -<span style="color: rgb(0, 128, 128);">3</span>,<br /><img src="/img/sc/I.gif" align="top" />    Duplicate = -<span style="color: rgb(0, 128, 128);">4</span><br /><img src="/img/sc/L.gif" align="top" />}
</div></div>
        <p>
This should cover the common responses from our database however to make it a little
more futureproof we'll keep -1 through to -10 reserved for this data level and then
start more specific responses from -11 (i.e. BadPassword).
</p>
        <p>
Using it is simple (this is not real code before you ask!):
</p>
        <div class="code">
          <img src="/img/sc/clear.gif" align="top" />
          <span style="color: rgb(0, 0, 255);">public bool</span> Save()<br /><div style="display: none;" id="closed632990943429062500_2"><img src="/img/sc/PlusNoLines.gif" onclick="open632990943429062500_2.style.display='block'; closed632990943429062500_2.style.display='none'; " align="top" /><b><span style="color: rgb(0, 0, 139);">{...}</span></b></div><div style="display: block;" id="open632990943429062500_2"><img src="/img/sc/minusNoTopLine.gif" onclick="open632990943429062500_2.style.display='none'; closed632990943429062500_2.style.display='block'; " align="top" />{<br /><img src="/img/sc/I.gif" align="top" />    DatabaseLayer DBLayer = <span style="color: rgb(0, 0, 255);">new</span> DatabaseLayer();<br /><img src="/img/sc/I.gif" align="top" /><br /><img src="/img/sc/I.gif" align="top" />    <span style="color: rgb(0, 128, 0);">//Check whether we should be saving or inserting this record</span><br /><img src="/img/sc/I.gif" align="top" />    <span style="color: rgb(0, 0, 255);">if</span> (<span style="color: rgb(0, 0, 255);">this</span>.Id ==
(<font color="#0000ff">int</font>)DatabaseLayer.DatabaseResponse.Init)<br /><div style="display: none;" id="closed632990943429062500_7"><img src="/img/sc/plus.gif" onclick="open632990943429062500_7.style.display='block'; closed632990943429062500_7.style.display='none'; " align="top" />    <b><span style="color: rgb(0, 0, 139);">{...}</span></b></div><div style="display: block;" id="open632990943429062500_7"><img src="/img/sc/minus.gif" onclick="open632990943429062500_7.style.display='none'; closed632990943429062500_7.style.display='block'; " align="top" />    {<br /><img src="/img/sc/I.gif" align="top" />        <span style="color: rgb(0, 128, 0);">//The Id's set to initialised only so insert</span><br /><img src="/img/sc/I.gif" align="top" />        <span style="color: rgb(0, 128, 0);">//The create method simply inserts the values into the database and returns</span><br /><img src="/img/sc/I.gif" align="top" />        <span style="color: rgb(0, 128, 0);">//either the Id of the newly inserted record or our database response</span><br /><img src="/img/sc/I.gif" align="top" />        <span style="color: rgb(0, 0, 255);">this</span>.Id = DBLayer.Create(<span style="color: rgb(0, 0, 255);">this</span>);<br /><img src="/img/sc/I.gif" align="top" /><br /><img src="/img/sc/I.gif" align="top" />        <span style="color: rgb(0, 0, 255);">if</span> (<span style="color: rgb(0, 0, 255);">this</span>.Id
&gt;= (<font color="#0000ff">int</font>)DatabaseLayer.DatabaseResponse.Success)<br /><div style="display: none;" id="closed632990943429062500_14"><img src="/img/sc/plus.gif" onclick="open632990943429062500_14.style.display='block'; closed632990943429062500_14.style.display='none'; " align="top" />        <b><span style="color: rgb(0, 0, 139);">{...}</span></b></div><div style="display: block;" id="open632990943429062500_14"><img src="/img/sc/minus.gif" onclick="open632990943429062500_14.style.display='none'; closed632990943429062500_14.style.display='block'; " align="top" />        {<br /><img src="/img/sc/I.gif" align="top" />            <span style="color: rgb(0, 128, 0);">//The insert was a success</span><br /><img src="/img/sc/I.gif" align="top" />            <span style="color: rgb(0, 0, 255);">return true</span>; <br /><img src="/img/sc/L.gif" align="top" />        }
</div><img src="/img/sc/I.gif" align="top" />        <span style="color: rgb(0, 0, 255);">else</span><br /><div style="display: none;" id="closed632990943429062500_19"><img src="/img/sc/plus.gif" onclick="open632990943429062500_19.style.display='block'; closed632990943429062500_19.style.display='none'; " align="top" />        <b><span style="color: rgb(0, 0, 139);">{...}</span></b></div><div style="display: block;" id="open632990943429062500_19"><img src="/img/sc/minus.gif" onclick="open632990943429062500_19.style.display='none'; closed632990943429062500_19.style.display='block'; " align="top" />        {<br /><img src="/img/sc/I.gif" align="top" />            <span style="color: rgb(0, 128, 0);">//The insert failed for some reason -you could throw an error</span> <br /><img src="/img/sc/I.gif" align="top" />            <span style="color: rgb(0, 128, 0);">//to catch or simply bubble the response upto to the code behind layer</span><br /><img src="/img/sc/I.gif" align="top" />            <span style="color: rgb(0, 0, 255);">return false</span>; <br /><img src="/img/sc/L.gif" align="top" />        }
</div><img src="/img/sc/L.gif" align="top" />    }
</div><img src="/img/sc/I.gif" align="top" />    <span style="color: rgb(0, 0, 255);">else</span><br /><div style="display: none;" id="closed632990943429062500_26"><img src="/img/sc/plus.gif" onclick="open632990943429062500_26.style.display='block'; closed632990943429062500_26.style.display='none'; " align="top" />    <b><span style="color: rgb(0, 0, 139);">{...}</span></b></div><div style="display: block;" id="open632990943429062500_26"><img src="/img/sc/minus.gif" onclick="open632990943429062500_26.style.display='none'; closed632990943429062500_26.style.display='block'; " align="top" />    {<br /><img src="/img/sc/I.gif" align="top" />        <span style="color: rgb(0, 128, 0);">//When updating the record don't use the Id to store the response, instead</span><br /><img src="/img/sc/I.gif" align="top" />        <span style="color: rgb(0, 128, 0);">//throw it into a temp object and use that so the Id's still stored in the object</span><br /><img src="/img/sc/I.gif" align="top" />        <span style="color: rgb(0, 0, 255);">int</span> response = DBLayer.Update(<span style="color: rgb(0, 0, 255);">this</span>);<br /><img src="/img/sc/I.gif" align="top" /><br /><img src="/img/sc/I.gif" align="top" />        <span style="color: rgb(0, 0, 255);">if</span> (response ==
(<font color="#0000ff">int</font>)DatabaseLayer.DatabaseResponse.Success)<br /><img src="/img/sc/I.gif" align="top" />            <span style="color: rgb(0, 0, 255);">return true</span>; <span style="color: rgb(0, 128, 0);">//All's ok</span><br /><img src="/img/sc/I.gif" align="top" />        <span style="color: rgb(0, 0, 255);">else</span><br /><img src="/img/sc/I.gif" align="top" />            <span style="color: rgb(0, 0, 255);">return false</span>; <span style="color: rgb(0, 128, 0);">//Something went wrong -it could be the item wasn't found etc</span><br /><img src="/img/sc/L.gif" align="top" />    }
</div><img src="/img/sc/L.gif" align="top" />}
</div></div>
        <img width="0" height="0" src="http://blogs.thesitedoctor.co.uk/test/aggbug.ashx?id=27138caa-da1d-478b-a09a-474206111338" />
      </body>
      <title>Making sense of database responses</title>
      <guid isPermaLink="false">http://blogs.thesitedoctor.co.uk/test/PermaLink,guid,27138caa-da1d-478b-a09a-474206111338.aspx</guid>
      <link>http://blogs.thesitedoctor.co.uk/test/2006/11/13/MakingSenseOfDatabaseResponses.aspx</link>
      <pubDate>Mon, 13 Nov 2006 20:48:41 GMT</pubDate>
      <description>&lt;p&gt;
We're nearing the end of a large system for the lovely people over at &lt;a href="http://www.consol.co.uk/"&gt;Consolidated
Communications Management Ltd&lt;/a&gt; and we've just come across a nice idea to make sense
of database responses. Typically in the past we've simply returned -1/0 for failure
and a positive integer (usually an id) of it was successful. The new method should
add a little more conformity to our code. We already use a common Database Access
Layer which handles the opening/closing of our connection, adding parameters etc but
I’ve just added an enum with the common database responses, thought it may be of use
to others:
&lt;/p&gt;
&lt;div class="code"&gt;
&lt;img src="/img/sc/clear.gif" align="top"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&amp;nbsp;enum&lt;/span&gt;&amp;nbsp;DatabaseResponse&lt;br&gt;
&lt;div style="display: none;" id="closed632990474472708750_2"&gt;&lt;img src="/img/sc/PlusNoLines.gif" onclick="open632990474472708750_2.style.display='block'; closed632990474472708750_2.style.display='none'; " align="top"&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 139);"&gt;{...}&lt;/span&gt;&lt;/b&gt;
&lt;/div&gt;
&lt;div style="display: block;" id="open632990474472708750_2"&gt;&lt;img src="/img/sc/minusNoTopLine.gif" onclick="open632990474472708750_2.style.display='none'; closed632990474472708750_2.style.display='block'; " align="top"&gt;{&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Success&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(0, 128, 128);"&gt;0&lt;/span&gt;,&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Init&amp;nbsp;=&amp;nbsp;-&lt;span style="color: rgb(0, 128, 128);"&gt;1&lt;/span&gt;,&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Found&amp;nbsp;=&amp;nbsp;-&lt;span style="color: rgb(0, 128, 128);"&gt;2&lt;/span&gt;,&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NotFound&amp;nbsp;=&amp;nbsp;-&lt;span style="color: rgb(0, 128, 128);"&gt;3&lt;/span&gt;,&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Duplicate&amp;nbsp;=&amp;nbsp;-&lt;span style="color: rgb(0, 128, 128);"&gt;4&lt;/span&gt;
&lt;br&gt;
&lt;img src="/img/sc/L.gif" align="top"&gt;}
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
This should cover the common responses from our database however to make it a little
more futureproof we'll keep -1 through to -10 reserved for this data level and then
start more specific responses from -11 (i.e. BadPassword).
&lt;/p&gt;
&lt;p&gt;
Using it is simple (this is not real code before you ask!):
&lt;/p&gt;
&lt;div class="code"&gt;
&lt;img src="/img/sc/clear.gif" align="top"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;public&amp;nbsp;bool&lt;/span&gt;&amp;nbsp;Save()&lt;br&gt;
&lt;div style="display: none;" id="closed632990943429062500_2"&gt;&lt;img src="/img/sc/PlusNoLines.gif" onclick="open632990943429062500_2.style.display='block'; closed632990943429062500_2.style.display='none'; " align="top"&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 139);"&gt;{...}&lt;/span&gt;&lt;/b&gt;
&lt;/div&gt;
&lt;div style="display: block;" id="open632990943429062500_2"&gt;&lt;img src="/img/sc/minusNoTopLine.gif" onclick="open632990943429062500_2.style.display='none'; closed632990943429062500_2.style.display='block'; " align="top"&gt;{&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DatabaseLayer&amp;nbsp;DBLayer&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt;&amp;nbsp;DatabaseLayer();&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;
&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//Check&amp;nbsp;whether&amp;nbsp;we&amp;nbsp;should&amp;nbsp;be&amp;nbsp;saving&amp;nbsp;or&amp;nbsp;inserting&amp;nbsp;this&amp;nbsp;record&lt;/span&gt;
&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.Id&amp;nbsp;==
(&lt;font color="#0000ff"&gt;int&lt;/font&gt;)DatabaseLayer.DatabaseResponse.Init)&lt;br&gt;
&lt;div style="display: none;" id="closed632990943429062500_7"&gt;&lt;img src="/img/sc/plus.gif" onclick="open632990943429062500_7.style.display='block'; closed632990943429062500_7.style.display='none'; " align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;span style="color: rgb(0, 0, 139);"&gt;{...}&lt;/span&gt;&lt;/b&gt;
&lt;/div&gt;
&lt;div style="display: block;" id="open632990943429062500_7"&gt;&lt;img src="/img/sc/minus.gif" onclick="open632990943429062500_7.style.display='none'; closed632990943429062500_7.style.display='block'; " align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//The&amp;nbsp;Id's&amp;nbsp;set&amp;nbsp;to&amp;nbsp;initialised&amp;nbsp;only&amp;nbsp;so&amp;nbsp;insert&lt;/span&gt;
&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//The&amp;nbsp;create&amp;nbsp;method&amp;nbsp;simply&amp;nbsp;inserts&amp;nbsp;the&amp;nbsp;values&amp;nbsp;into&amp;nbsp;the&amp;nbsp;database&amp;nbsp;and&amp;nbsp;returns&lt;/span&gt;
&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//either&amp;nbsp;the&amp;nbsp;Id&amp;nbsp;of&amp;nbsp;the&amp;nbsp;newly&amp;nbsp;inserted&amp;nbsp;record&amp;nbsp;or&amp;nbsp;our&amp;nbsp;database&amp;nbsp;response&lt;/span&gt;
&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.Id&amp;nbsp;=&amp;nbsp;DBLayer.Create(&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;);&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;
&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;.Id
&amp;gt;= (&lt;font color="#0000ff"&gt;int&lt;/font&gt;)DatabaseLayer.DatabaseResponse.Success)&lt;br&gt;
&lt;div style="display: none;" id="closed632990943429062500_14"&gt;&lt;img src="/img/sc/plus.gif" onclick="open632990943429062500_14.style.display='block'; closed632990943429062500_14.style.display='none'; " align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;span style="color: rgb(0, 0, 139);"&gt;{...}&lt;/span&gt;&lt;/b&gt;
&lt;/div&gt;
&lt;div style="display: block;" id="open632990943429062500_14"&gt;&lt;img src="/img/sc/minus.gif" onclick="open632990943429062500_14.style.display='none'; closed632990943429062500_14.style.display='block'; " align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//The&amp;nbsp;insert&amp;nbsp;was&amp;nbsp;a&amp;nbsp;success&lt;/span&gt;
&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;return&amp;nbsp;true&lt;/span&gt;;&amp;nbsp;&lt;br&gt;
&lt;img src="/img/sc/L.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;/div&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;else&lt;/span&gt;
&lt;br&gt;
&lt;div style="display: none;" id="closed632990943429062500_19"&gt;&lt;img src="/img/sc/plus.gif" onclick="open632990943429062500_19.style.display='block'; closed632990943429062500_19.style.display='none'; " align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;span style="color: rgb(0, 0, 139);"&gt;{...}&lt;/span&gt;&lt;/b&gt;
&lt;/div&gt;
&lt;div style="display: block;" id="open632990943429062500_19"&gt;&lt;img src="/img/sc/minus.gif" onclick="open632990943429062500_19.style.display='none'; closed632990943429062500_19.style.display='block'; " align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//The&amp;nbsp;insert&amp;nbsp;failed&amp;nbsp;for&amp;nbsp;some&amp;nbsp;reason&amp;nbsp;-you&amp;nbsp;could&amp;nbsp;throw&amp;nbsp;an&amp;nbsp;error&lt;/span&gt;&amp;nbsp;&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//to&amp;nbsp;catch&amp;nbsp;or&amp;nbsp;simply&amp;nbsp;bubble&amp;nbsp;the&amp;nbsp;response&amp;nbsp;upto&amp;nbsp;to&amp;nbsp;the&amp;nbsp;code&amp;nbsp;behind&amp;nbsp;layer&lt;/span&gt;
&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;return&amp;nbsp;false&lt;/span&gt;;&amp;nbsp;&lt;br&gt;
&lt;img src="/img/sc/L.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;/div&gt;
&lt;img src="/img/sc/L.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;/div&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;else&lt;/span&gt;
&lt;br&gt;
&lt;div style="display: none;" id="closed632990943429062500_26"&gt;&lt;img src="/img/sc/plus.gif" onclick="open632990943429062500_26.style.display='block'; closed632990943429062500_26.style.display='none'; " align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&lt;span style="color: rgb(0, 0, 139);"&gt;{...}&lt;/span&gt;&lt;/b&gt;
&lt;/div&gt;
&lt;div style="display: block;" id="open632990943429062500_26"&gt;&lt;img src="/img/sc/minus.gif" onclick="open632990943429062500_26.style.display='none'; closed632990943429062500_26.style.display='block'; " align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//When&amp;nbsp;updating&amp;nbsp;the&amp;nbsp;record&amp;nbsp;don't&amp;nbsp;use&amp;nbsp;the&amp;nbsp;Id&amp;nbsp;to&amp;nbsp;store&amp;nbsp;the&amp;nbsp;response,&amp;nbsp;instead&lt;/span&gt;
&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//throw&amp;nbsp;it&amp;nbsp;into&amp;nbsp;a&amp;nbsp;temp&amp;nbsp;object&amp;nbsp;and&amp;nbsp;use&amp;nbsp;that&amp;nbsp;so&amp;nbsp;the&amp;nbsp;Id's&amp;nbsp;still&amp;nbsp;stored&amp;nbsp;in&amp;nbsp;the&amp;nbsp;object&lt;/span&gt;
&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;int&lt;/span&gt;&amp;nbsp;response&amp;nbsp;=&amp;nbsp;DBLayer.Update(&lt;span style="color: rgb(0, 0, 255);"&gt;this&lt;/span&gt;);&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;
&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&amp;nbsp;(response&amp;nbsp;==
(&lt;font color="#0000ff"&gt;int&lt;/font&gt;)DatabaseLayer.DatabaseResponse.Success)&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;return&amp;nbsp;true&lt;/span&gt;;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//All's&amp;nbsp;ok&lt;/span&gt;
&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;else&lt;/span&gt;
&lt;br&gt;
&lt;img src="/img/sc/I.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;return&amp;nbsp;false&lt;/span&gt;;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//Something&amp;nbsp;went&amp;nbsp;wrong&amp;nbsp;-it&amp;nbsp;could&amp;nbsp;be&amp;nbsp;the&amp;nbsp;item&amp;nbsp;wasn't&amp;nbsp;found&amp;nbsp;etc&lt;/span&gt;
&lt;br&gt;
&lt;img src="/img/sc/L.gif" align="top"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&lt;/div&gt;
&lt;img src="/img/sc/L.gif" align="top"&gt;}
&lt;/div&gt;
&lt;/div&gt;
&lt;img width="0" height="0" src="http://blogs.thesitedoctor.co.uk/test/aggbug.ashx?id=27138caa-da1d-478b-a09a-474206111338" /&gt;</description>
      <comments>http://blogs.thesitedoctor.co.uk/test/CommentView,guid,27138caa-da1d-478b-a09a-474206111338.aspx</comments>
      <category>ASP</category>
      <category>ASP.Net</category>
      <category>SQL Server</category>
    </item>
    <item>
      <trackback:ping>http://blogs.thesitedoctor.co.uk/test/Trackback.aspx?guid=a9cdb859-35e3-4965-a124-bd9a396c2c04</trackback:ping>
      <pingback:server>http://blogs.thesitedoctor.co.uk/test/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.thesitedoctor.co.uk/test/PermaLink,guid,a9cdb859-35e3-4965-a124-bd9a396c2c04.aspx</pingback:target>
      <dc:creator>Tim</dc:creator>
      <wfw:comment>http://blogs.thesitedoctor.co.uk/test/CommentView,guid,a9cdb859-35e3-4965-a124-bd9a396c2c04.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.thesitedoctor.co.uk/test/SyndicationService.asmx/GetEntryCommentsRss?guid=a9cdb859-35e3-4965-a124-bd9a396c2c04</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
After the fun and games we had with IE and sorting out an old CSS design for <a href="http://www.technikfloor.co.uk/">www.technikfloor.co.uk</a> on
Friday when I saw this pie chart I thought it was an excellent summary of a modern
web designer’s life.
</p>
        <p>
Personally I feel my Teal coloured slice is smaller but hey!
</p>
        <p>
          <img src="img/Chucking-A-Wobbly.png" alt="Time Breakdown of Modern Wed Design" />
        </p>
        <p>
Originally posted at: <a href="http://www.dangerouslyawesome.com/2006/07/02/throwing-a-wobbly/">http://www.dangerouslyawesome.com/2006/07/02/throwing-a-wobbly/</a></p>
        <img width="0" height="0" src="http://blogs.thesitedoctor.co.uk/test/aggbug.ashx?id=a9cdb859-35e3-4965-a124-bd9a396c2c04" />
      </body>
      <title>Time Breakdown of Modern Web Design</title>
      <guid isPermaLink="false">http://blogs.thesitedoctor.co.uk/test/PermaLink,guid,a9cdb859-35e3-4965-a124-bd9a396c2c04.aspx</guid>
      <link>http://blogs.thesitedoctor.co.uk/test/2006/11/04/TimeBreakdownOfModernWebDesign.aspx</link>
      <pubDate>Sat, 04 Nov 2006 12:12:12 GMT</pubDate>
      <description>&lt;p&gt;
After the fun and games we had with IE and sorting out an old CSS design for &lt;a href="http://www.technikfloor.co.uk/"&gt;www.technikfloor.co.uk&lt;/a&gt; on
Friday when I saw this pie chart I thought it was an excellent summary of a modern
web designer’s life.
&lt;/p&gt;
&lt;p&gt;
Personally I feel my Teal coloured slice is smaller but hey!
&lt;/p&gt;
&lt;p&gt;
&lt;img src="img/Chucking-A-Wobbly.png" alt="Time Breakdown of Modern Wed Design"&gt;
&lt;/p&gt;
&lt;p&gt;
Originally posted at: &lt;a href="http://www.dangerouslyawesome.com/2006/07/02/throwing-a-wobbly/"&gt;http://www.dangerouslyawesome.com/2006/07/02/throwing-a-wobbly/&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.thesitedoctor.co.uk/test/aggbug.ashx?id=a9cdb859-35e3-4965-a124-bd9a396c2c04" /&gt;</description>
      <comments>http://blogs.thesitedoctor.co.uk/test/CommentView,guid,a9cdb859-35e3-4965-a124-bd9a396c2c04.aspx</comments>
      <category>ASP</category>
      <category>ASP.Net</category>
      <category>Business</category>
      <category>General</category>
    </item>
    <item>
      <trackback:ping>http://blogs.thesitedoctor.co.uk/test/Trackback.aspx?guid=00cefff0-f235-4cf2-9c0f-009731aebc1c</trackback:ping>
      <pingback:server>http://blogs.thesitedoctor.co.uk/test/pingback.aspx</pingback:server>
      <pingback:target>http://blogs.thesitedoctor.co.uk/test/PermaLink,guid,00cefff0-f235-4cf2-9c0f-009731aebc1c.aspx</pingback:target>
      <dc:creator />
      <wfw:comment>http://blogs.thesitedoctor.co.uk/test/CommentView,guid,00cefff0-f235-4cf2-9c0f-009731aebc1c.aspx</wfw:comment>
      <wfw:commentRss>http://blogs.thesitedoctor.co.uk/test/SyndicationService.asmx/GetEntryCommentsRss?guid=00cefff0-f235-4cf2-9c0f-009731aebc1c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
I made an interesting discovery this morning. A few weeks ago I was doing a little
SEO on <a href="http://www.wargamecompany.co.uk/">The Wargame Company (Devon)</a> and
thought I would look into utilising <a href="http://www.google.com/webmasters/sitemaps/">Google
SiteMaps</a>. After creating the XML file with the correct format it's just a matter
of having Google approve it. They do this by accessing a random page i.e. <u><a href="http://www.domain.com/GooglesWonderfulPageddmmyyyyhhmmssmmm">www.domain.com/GooglesWonderfulPageddmmyyyyhhmmssmmm</a></u> (which
clearly should return a 404) and check the response code -I guess to ensure that you're
not trying to spoof the pages in some way.
</p>
        <p>
"What's the problem? I've got custom 404 pages" I hear you cry! Well, if like
us you've written some fancy page to handle the error and email you/log it to a database, it
turns out that you're not returning a 404 error at all!
</p>
        <p>
What I discovered was that if you configure IIS to handle 404 error pages with a URL
you're actually returning a response code of 200. After a little thinking, the only
conclusion we could come to was that when setting it as a URL in IIS you're actually
redirecting the request which is either a 301 or perhaps a 307 (see <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html">http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html</a> for
more information on response codes) and then the final page the user hit's returns
a 200 (Response Status "OK") rather than the desired 404 -clearly not what we want!
</p>
        <p>
After a little more investigation we also found that the same thing happened when
using ASP.Net's built in handlers and the same thing happens, the only time it doesn't
is when you handle the 404 with a File in IIS rather than a URL.
</p>
        <p>
"What can I do about it?" Well that's simple, if you're going to use a URL to handle
your 404 errors, make sure you change the Response Status Codes to the correct code,
i.e. 404, this is pretty simple to do:
</p>
        <p>
          <strong>ASP.Net 2.0:</strong>
          <span style="font-size: 11px; color: black; font-family: Courier New; background-color: transparent;">Page.Response.StatusCode <span style="color: red;">=</span> 404;</span>
        </p>
        <p>
          <strong>ASP.Net 1.1 (I think):</strong>
          <span style="font-size: 11px; color: black; font-family: Courier New; background-color: transparent;">Response.StatusCode <span style="color: red;">=</span> 404;</span>
        </p>
        <p>
          <strong>ASP:</strong>
          <span style="font-size: 11px; color: black; font-family: Courier New; background-color: transparent;">Response.Status <span style="color: red;">=</span><span style="color: green;">"404
You are Unauthorized"</span></span>
        </p>
        <p>
I hope that helps someone out there!
</p>
        <p>
Tim
</p>
        <p>
          <strong>Update:</strong> I've just run fiddler on <a href="http://www.wargamecompany.co.uk/">The
Wargame Company (Devon)</a> and and can confirm you get a Response Status Code
of 301 before the 200.
</p>
        <img width="0" height="0" src="http://blogs.thesitedoctor.co.uk/test/aggbug.ashx?id=00cefff0-f235-4cf2-9c0f-009731aebc1c" />
      </body>
      <title>Custom 404 Error Pages</title>
      <guid isPermaLink="false">http://blogs.thesitedoctor.co.uk/test/PermaLink,guid,00cefff0-f235-4cf2-9c0f-009731aebc1c.aspx</guid>
      <link>http://blogs.thesitedoctor.co.uk/test/2006/06/16/Custom404ErrorPages.aspx</link>
      <pubDate>Fri, 16 Jun 2006 20:48:54 GMT</pubDate>
      <description>&lt;p&gt;
I made an interesting discovery this morning. A few weeks ago I was doing a little
SEO on &lt;a href="http://www.wargamecompany.co.uk/"&gt;The Wargame Company (Devon)&lt;/a&gt;&amp;nbsp;and
thought I would look into utilising &lt;a href="http://www.google.com/webmasters/sitemaps/"&gt;Google
SiteMaps&lt;/a&gt;. After creating the XML file with the correct format it's just a matter
of having Google approve it. They do this by&amp;nbsp;accessing a random page i.e. &lt;u&gt;&lt;a href="http://www.domain.com/GooglesWonderfulPageddmmyyyyhhmmssmmm"&gt;www.domain.com/GooglesWonderfulPageddmmyyyyhhmmssmmm&lt;/a&gt;&lt;/u&gt; (which
clearly should return a 404) and check the response code -I guess to ensure that you're
not trying to spoof the pages in some way.
&lt;/p&gt;
&lt;p&gt;
"What's the problem? I've got custom 404 pages"&amp;nbsp;I hear you cry! Well, if like
us you've written some fancy page to handle the error and email you/log it to a database,&amp;nbsp;it
turns out that you're not returning a 404 error at all!
&lt;/p&gt;
&lt;p&gt;
What I discovered was that if you configure IIS to handle 404 error pages with a URL
you're actually returning a response code of 200. After a little thinking, the only
conclusion we could come to was that when setting it as a URL in IIS you're actually
redirecting the request which is either a 301 or perhaps a 307 (see &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html"&gt;http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html&lt;/a&gt;&amp;nbsp;for
more information on response codes) and then the final page the user hit's returns
a 200 (Response Status "OK") rather than the desired 404 -clearly not what we want!
&lt;/p&gt;
&lt;p&gt;
After a little more investigation we also found that the same thing happened when
using ASP.Net's built in handlers and the same thing happens, the only time it doesn't
is when you handle the 404 with a File in IIS rather than a URL.
&lt;/p&gt;
&lt;p&gt;
"What can I do about it?" Well that's simple, if you're going to use a URL to handle
your 404 errors, make sure you change the Response Status Codes to the correct code,
i.e. 404, this is pretty simple to do:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;ASP.Net 2.0:&lt;/strong&gt; &lt;span style="font-size: 11px; color: black; font-family: Courier New; background-color: transparent;"&gt;Page.Response.StatusCode &lt;span style="color: red;"&gt;=&lt;/span&gt; 404;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;ASP.Net 1.1 (I think):&lt;/strong&gt; &lt;span style="font-size: 11px; color: black; font-family: Courier New; background-color: transparent;"&gt;Response.StatusCode &lt;span style="color: red;"&gt;=&lt;/span&gt; 404;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;ASP:&lt;/strong&gt; &lt;span style="font-size: 11px; color: black; font-family: Courier New; background-color: transparent;"&gt;Response.Status &lt;span style="color: red;"&gt;=&lt;/span&gt; &lt;span style="color: green;"&gt;"404
You are Unauthorized"&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
I hope that helps someone out there!
&lt;/p&gt;
&lt;p&gt;
Tim
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; I've just run fiddler on &lt;a href="http://www.wargamecompany.co.uk/"&gt;The
Wargame Company (Devon)&lt;/a&gt;&amp;nbsp;and and can confirm you get a Response Status Code
of 301 before the 200.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blogs.thesitedoctor.co.uk/test/aggbug.ashx?id=00cefff0-f235-4cf2-9c0f-009731aebc1c" /&gt;</description>
      <comments>http://blogs.thesitedoctor.co.uk/test/CommentView,guid,00cefff0-f235-4cf2-9c0f-009731aebc1c.aspx</comments>
      <category>ASP</category>
      <category>ASP.Net</category>
      <category>IIS</category>
      <category>SEO</category>
    </item>
  </channel>
</rss>