<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:cs="http://blogs.iis.net/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Another IIS Blog</title><link>http://blogs.iis.net/thomad/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/JustAnotherIISBlog" /><feedburner:info uri="justanotheriisblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>47.671346</geo:lat><geo:long>-122.341662</geo:long><item><title>Managing Windows EC2 Instances remotely with Powershell</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/Gajs67FsRDE/managing-windows-amazon-ec2-machines-remotely-with-powershell.aspx</link><pubDate>Thu, 12 Aug 2010 23:54:24 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:4025033</guid><dc:creator>thomad</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;For a long time now I'm trying to find out how to remotely manage an EC2 machine with Powershell.It finally worked. Here is how:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Start a new Windows Server 2008 EC2 instance. Keep the machine name, public DNS name and password for your EC2 machine handy. You'll need it later. &lt;/li&gt;    &lt;li&gt;Configure your Security Groups (which are firewall rules in essence) to allow connections to port 5985. &lt;/li&gt;    &lt;li&gt;Connect to it and install&amp;#160; &lt;a href="http://support.microsoft.com/?kbid=968930"&gt;PowerShell 2.0 for Windows Server 2008&lt;/a&gt;. Reboot. &lt;/li&gt;    &lt;li&gt;After the reboot I pretty much followed &lt;a href="http://blogs.msdn.com/b/wmi/archive/2009/07/24/powershell-remoting-between-two-workgroup-machines.aspx"&gt;this walkthrough&lt;/a&gt;. Here the short version:      &lt;br /&gt;a) Run &lt;em&gt;&lt;strong&gt;Enable-PSRemoting –force&lt;/strong&gt;&lt;/em&gt; on your EC2 machine; elevated of course.       &lt;br /&gt;b) On the client, assuming it's Win7 runthe following Powershell commands:      &lt;br /&gt;&lt;i&gt;&amp;#160;&amp;#160; &lt;strong&gt;Start-Service WinRM         &lt;br /&gt;&amp;#160;&amp;#160; &lt;/strong&gt;&lt;/i&gt;&lt;strong&gt;&lt;i&gt;Set-ItemProperty –Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System –Name&amp;#160; LocalAccountTokenFilterPolicy –Value 1 –Type DWord         &lt;br /&gt;&amp;#160;&amp;#160; &lt;/i&gt;&lt;i&gt;Set-Item WSMan:\localhost\Client\TrustedHosts –Value &lt;font color="#ff0000"&gt;&amp;lt;Public DNS Name of your EC2 machine&amp;gt;&lt;/font&gt; -Force -Concatenate&lt;/i&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;You are ready to go. Connect from your client to EC2 with the New-PSSession cmdlet, for example:     &lt;br /&gt;&lt;strong&gt;New-PSSession -credential &lt;font color="#ff0000"&gt;&amp;lt;machine name of your EC2 machine&amp;gt;&lt;/font&gt;\Administrator -computername &lt;font color="#ff0000"&gt;&amp;lt;Public DNS Name of your EC2 machine&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;To execute commands on your EC2 machine I used the Enter-PSSession cmdlet, for example:     &lt;br /&gt;&lt;strong&gt;Enter-PSSession &lt;font color="#ff0000"&gt;&amp;lt;id returned by New-PSSession&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;After this you'll have a command-line on your EC2 machine. &lt;/li&gt; &lt;/ol&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=4025033" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DaVgYUcZF2YS7pjtqJU-gSYewdc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DaVgYUcZF2YS7pjtqJU-gSYewdc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DaVgYUcZF2YS7pjtqJU-gSYewdc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DaVgYUcZF2YS7pjtqJU-gSYewdc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Gajs67FsRDE:xi6IjXy0HW4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Gajs67FsRDE:xi6IjXy0HW4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=Gajs67FsRDE:xi6IjXy0HW4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Gajs67FsRDE:xi6IjXy0HW4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=Gajs67FsRDE:xi6IjXy0HW4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Gajs67FsRDE:xi6IjXy0HW4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/Gajs67FsRDE" height="1" width="1"/&gt;</description><category domain="http://blogs.iis.net/thomad/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://blogs.iis.net/thomad/archive/tags/Windows+Server+2008/default.aspx">Windows Server 2008</category><category domain="http://blogs.iis.net/thomad/archive/tags/Windows+PowerShell/default.aspx">Windows PowerShell</category><category domain="http://blogs.iis.net/thomad/archive/tags/EC2/default.aspx">EC2</category><feedburner:origLink>http://blogs.iis.net/thomad/archive/2010/08/12/managing-windows-amazon-ec2-machines-remotely-with-powershell.aspx</feedburner:origLink></item><item><title>Troubleshooting Helper Script for Microsoft Web Matrix</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/Nte7pe2qmKs/troubleshooting-helper-script-for-microsoft-web-matrix.aspx</link><pubDate>Tue, 06 Jul 2010 20:55:24 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3960202</guid><dc:creator>thomad</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Well, this didn't work too well. I had to replace the previous post with this one because the script had some issues. Let's start again:&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Web Matrix is released!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/web/webmatrix/"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="WebMatrix Stack" src="http://www.microsoft.com/web/media/webx-stack-gfx.png" width="127" height="133" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.microsoft.com/web/webmatrix/"&gt;Microsoft Web Matrix&lt;/a&gt; is in beta now. As with all beta software &lt;em&gt;&lt;strong&gt;there is a chance you run into issues you can't explain and can't figure out yourself&lt;/strong&gt;&lt;/em&gt;. Time to go to the &lt;a href="http://forums.iis.net/1166.aspx"&gt;Web Matrix forums&lt;/a&gt; to ask for help. But sometimes a description of the problem is not enough. With the following executable you can attach a ZIP archive with &lt;strong&gt;all&lt;/strong&gt; Web Matrix related log files to your problem description. With this information an expert has a much better chance to find the root cause for your problem.&amp;#160; All you have to do is to run the executable. After you ran it you will find a ZIP archive with the name WebMatrixKaputtLogs.ZIP in the current directory. &lt;/p&gt;  &lt;p&gt;Here is the the &lt;a href="http://blogs.iis.net/blogs/thomad/WebMatrixKaputt.zip"&gt;download URL&lt;/a&gt;. Unpack the ZIP and copy WebMatrixKaputt.exe to a directory of your choice. &lt;/p&gt;  &lt;h2&gt;&amp;#160;&lt;/h2&gt;  &lt;h2&gt;What WebMatrixKaputt.EXE Does&lt;/h2&gt;  &lt;p&gt;1) Gathering system information via the &lt;a href="http://technet.microsoft.com/en-us/library/bb491007.aspx"&gt;systeminfo.exe&lt;/a&gt; tool. The output is saved to a file with the name systeminfo.txt in the temp directory.&lt;/p&gt;  &lt;p&gt;2) A ZIP file with all the log and configuration information produced by Web Matrix are added to the ZIP archive: &lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;li&gt;The systeminfo.txt file generated in the previous step&lt;/li&gt;      &lt;li&gt;The &lt;a href="http://www.microsoft.com/web/downloads/platform.aspx"&gt;Web Platform Installer&lt;/a&gt; logs (files underneath the %userprofile%\appdata\local\microsoft\web platform installer\logs directory). &lt;strong&gt;ATTENTION:&lt;/strong&gt; these logs might contain the passwords you used to install Web Platform components. &lt;/li&gt;      &lt;li&gt;Log files and trace files written by IIS Express (files underneath %userprofile%\documents\IISExpress8\config, %userprofile%\documents\IISExpress8\logfiles and %userprofile%\documents\IISExpress8\TraceLogfiles) &lt;/li&gt;      &lt;li&gt;Log files written by HTTP.SYS, the underlying HTTP kernel-mode driver used by IIS Express (files underneath the %windir%\system32\logfiles\HTTPErr directory) &lt;/li&gt;      &lt;li&gt;Log files written during IIS Express process startup (%temp%\iisexpress8 directory) &lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Hope you never have to use it though :)&lt;/p&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3960202" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fwnQY1gRlCvmLJCj_ll19GSrOR8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fwnQY1gRlCvmLJCj_ll19GSrOR8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fwnQY1gRlCvmLJCj_ll19GSrOR8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fwnQY1gRlCvmLJCj_ll19GSrOR8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Nte7pe2qmKs:jISOrZ50azU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Nte7pe2qmKs:jISOrZ50azU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=Nte7pe2qmKs:jISOrZ50azU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Nte7pe2qmKs:jISOrZ50azU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=Nte7pe2qmKs:jISOrZ50azU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Nte7pe2qmKs:jISOrZ50azU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/Nte7pe2qmKs" height="1" width="1"/&gt;</description><feedburner:origLink>http://blogs.iis.net/thomad/archive/2010/07/06/troubleshooting-helper-script-for-microsoft-web-matrix.aspx</feedburner:origLink></item><item><title>My Web Site is so slow… And I don't know what to do about it!</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/qyJTE6mjwt8/my-web-site-is-so-slow-and-i-don-t-know-what-to-do-about-it.aspx</link><pubDate>Tue, 08 Jun 2010 04:39:51 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3907747</guid><dc:creator>thomad</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;TechEd Northamerica started today. It's huge - more than 11,000 attendees from what I hear. One of my talks, titled &lt;strong&gt;&amp;quot;My Web Site is so slow…and I don't know what to do about it&amp;quot;&lt;/strong&gt;, happened this afternoon (&lt;a href="http://blogs.iis.net/blogs/thomad/TechEd2010/web308_thomad.zip"&gt;here the PPTX&lt;/a&gt;). &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/TechEd2010/web308_thomad.zip"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 5px 10px 5px 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MyWebSiteissoslowAndIdontknowwhattodoabo_10F89/image_12.png" width="305" height="173" /&gt;&lt;/a&gt; I had so much information plus eight demos that I ended exactly 6 seconds before they cut me off. I promised the audience to post all the resources and tools I used to come up with this talk on my blog. So I'm sitting here in the Sheraton Canal Street lobby, enjoy free WIFI, a pint of beer assembling all the information I collected on web performance over the last year. &lt;/p&gt;  &lt;p&gt;Before I start listing Best Practices for specific topics I need to call out the three books I found the most useful: &lt;/p&gt;  &lt;h2&gt;Books&lt;/h2&gt;  &lt;p&gt;1) The two &lt;a href="http://www.stevesouders.com" target="_blank"&gt;Steve Souders&lt;/a&gt; books &lt;a href="http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309/ref=sr_1_fkmr0_1?ie=UTF8&amp;amp;qid=1275962210&amp;amp;sr=8-1-fkmr0" target="_blank"&gt;&amp;quot;High Performance Web Sites&amp;quot;&lt;/a&gt; and &lt;a href="http://www.amazon.com/Even-Faster-Web-Sites-Performance/dp/0596522304/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1275962248&amp;amp;sr=8-1-catcorr" target="_blank"&gt;&amp;quot;Even Faster Web Sites&amp;quot;&lt;/a&gt; are probably a must-have for everybody concerned about web performance.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309/ref=sr_1_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1275962248&amp;amp;sr=8-2-catcorr"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MyWebSiteissoslowAndIdontknowwhattodoabo_10F89/image_9.png" width="187" height="244" /&gt;&lt;/a&gt; &lt;a href="http://www.amazon.com/Even-Faster-Web-Sites-Performance/dp/0596522304/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1275962248&amp;amp;sr=8-1-catcorr"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MyWebSiteissoslowAndIdontknowwhattodoabo_10F89/image_8.png" width="187" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Unfortunately Souders is thin when it comes to IIS; ASP.NET isn't mentioned once. Reason enough to give this TechEd talk. &lt;/p&gt;  &lt;p&gt;2) Only recently I discovered &lt;a href="http://www.amazon.com/Ultra-Fast-ASP-NET-Build-Ultra-Scalable-Server/dp/1430223839/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1275962721&amp;amp;sr=1-1"&gt;&amp;quot;Ultra-Fast ASP.NET&amp;quot;&lt;/a&gt; by Richard Kiessig. The title wasn't too appealing but I browsed through it anyway. And &amp;quot;Eureka&amp;quot; - this is a great book. As a Program Manager in IIS for almost 10 years I'm used to authors who know how to write but have no idea what they are writing about. Not so with Richard Kiessig's book. It's very thorough, everything is well-reasoned and explained. I learned quite a few things about IIS and ASP.NET that I wasn't aware of. &lt;/p&gt;  &lt;p&gt;&amp;#160; &lt;a href="http://www.amazon.com/Ultra-Fast-ASP-NET-Build-Ultra-Scalable-Server/dp/1430223839/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1275962721&amp;amp;sr=1-1"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MyWebSiteissoslowAndIdontknowwhattodoabo_10F89/image_7.png" width="185" height="244" /&gt;&lt;/a&gt;&amp;#160; &lt;/p&gt;  &lt;h2&gt;General Web Performance Tools&lt;/h2&gt;  &lt;p&gt;Well, the obvious ones: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.fiddler2.com/fiddler2"&gt;Fiddler&lt;/a&gt; - Eric Lawrence's Web Debugging Proxy is tremendously to understand what's going on between a web browser and the web server&lt;/p&gt;  &lt;p&gt;&lt;a href="http://developer.yahoo.com/yslow/"&gt;YSlow&lt;/a&gt; - for a quick look on how a particular web-site is doing with regards to performance. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.google.com/speed/page-speed/"&gt;PageSpeed&lt;/a&gt; - Google's answer to YSlow. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.iis.net/community/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1467"&gt;WCAT&lt;/a&gt; - WCAT is the tool you want if you want your web server to break a sweat. And if you are like I am and too lazy to write WCAT scripts you probably want the &lt;a href="http://blogs.iis.net/thomad/archive/2010/05/11/using-the-wcat-fiddler-extension-for-web-server-performance-tests.aspx"&gt;WCAT Extension for Fiddler&lt;/a&gt;. With it you can select a few Fiddler sessions and the &lt;a href="http://blogs.iis.net/thomad/archive/2010/05/11/using-the-wcat-fiddler-extension-for-web-server-performance-tests.aspx"&gt;WCAT Extension for Fiddler&lt;/a&gt; will create and run the WCAT script for you - all automatically. &lt;/p&gt;  &lt;h2&gt;Reference web sites &lt;/h2&gt;  &lt;p&gt;&lt;a href="http://developer.yahoo.com/performance/rules.html"&gt;Yahoo's exceptional performance team&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.stevesouders.com"&gt;Steve Souders site&lt;/a&gt; and &lt;a href="http://www.stevesouders.com/blog/feed/"&gt;Blog Feed&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;There are probably more, but I'm at Marguerites now, its getting late and there is still a lot to write. &lt;/p&gt;  &lt;h2&gt;Improving Web Server Performance&lt;/h2&gt;  &lt;p&gt;I structured the talk in five parts. First I explained why performance is important, then I went through some terminology and discussed the areas where web performance can be improved. Then I went through every performance area and discussed Best Practices. Here are the three areas:&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Speeding up Server Execution &lt;/li&gt;    &lt;li&gt;Optimizing Network Transfer &lt;/li&gt;    &lt;li&gt;Frontend Optimizations &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Best Practices &lt;/h2&gt;  &lt;p&gt;Here are the Best Practices discussed. As already said it in the talk: web performance is a huge area and one could probably talk for days about Performance Best Practices. I picked the ones I thought have the most impact for my TechEd attendees. &lt;/p&gt;  &lt;h3&gt;Server Execution Best Practices&lt;/h3&gt;  &lt;p&gt;The Server Execution section was about doing more, faster with fewer resources. This is the area where IIS really shines. No other general purpose web server is capable of sustaining the throughput IIS/ASP.Net are able to handle. I think however that by focusing too much on Server Execution we neglected the other areas, i.e. network transfer and frontend optimizations. But be it as it is - here are the Server Execution Best Practices I discussed:&lt;/p&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="580"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="203"&gt;&lt;strong&gt;Best Practice&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="375"&gt;&lt;strong&gt;Links/Resources/Comments&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="205"&gt;Run Windows Server 2008 (R2) on new hardware&lt;/td&gt;        &lt;td valign="top" width="374"&gt;I didn't find an article that explicitly discusses this. We ran into this issue however when Windows Server 2008 was in Beta. The Windows Server 2008 bits are optimized to take advantage of the features of new CPU architectures. You probably will see that Windows Server 2008 doesn't perform well on old hardware compared to Windows Server 2003. &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="206"&gt;IIS: Put existing default document on top of the Default Document list&lt;/td&gt;        &lt;td valign="top" width="374"&gt;The list of IIS default documents increased over the years (iisstart.htm, default.htm, default.asp, index.htm, index.php etc.). Problem is that IIS has to go through the list of default documents and look in the file system until it finds one that actually exists. You can increase the execution speed by stripping the list of default documents or putting the one you are using on top of the list. &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="206"&gt;IIS: Use IIS7 or ASP.NET output caching&lt;/td&gt;        &lt;td valign="top" width="374"&gt;There is a good &lt;a href="http://www.asp.net/mvc/tutorials/improving-performance-with-output-caching-vb"&gt;tutorial&lt;/a&gt; on the ASP.NET web-site on how to take advantage of Output Caching. Ultra-Fast ASP.NET also has a chapter on it.           &lt;br /&gt;IIS7 Output Caching is discussed in &lt;a href="http://learn.iis.net/page.aspx/154/walkthrough-iis-70-output-caching/"&gt;this&lt;/a&gt; Learn.IIS.Net article. &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="206"&gt;IIS: Use authentication and SSL only if necessary&lt;/td&gt;        &lt;td valign="top" width="374"&gt;Couldn't find something linkable but the problem is obvious: authentication can introduce a round-trip to the backend, e.g. Active Directory and encryption is CPU extensive. &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="206"&gt;IIS: Turn off unnecessary features like Request Tracing&lt;/td&gt;        &lt;td valign="top" width="374"&gt;Request and ETW Tracing is pretty lean and invaluable for troubleshooting problems. But if you are under a lot of load you should probably turn these features off. &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="206"&gt;PHP: Use FastCGI and not CGI&lt;/td&gt;        &lt;td valign="top" width="374"&gt;The IIS team is committed to make PHP run well on Windows. Providing a first class FastCGI implementation was the first step which made this a reality. The &lt;a href="www.microsoft.com/web/"&gt;Web Platform Installer&lt;/a&gt; makes installing PHP on IIS a one-click experience. Everything else on &lt;a href="http://php.iis.net"&gt;http://php.iis.net&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="206"&gt;PHP: Enable Wincache&lt;/td&gt;        &lt;td valign="top" width="374"&gt;if you run PHP without an output cache you will quickly run into performance problems. &lt;a href="http://www.iis.net/download/WinCacheForPHP"&gt;Wincache&lt;/a&gt; is an Open Source output cache for PHP developed by the IIS team. The simplest way to install it: &lt;a href="www.microsoft.com/web"&gt;Web Platform Installer&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="206"&gt;PHP: Set FastCGI MaxInstances to 0&lt;/td&gt;        &lt;td valign="top" width="374"&gt;FastCGI spawns multiple PHP processes for each web application. If you are in a hosted environment this might soon become an issue. Here is a &lt;a href="http://www.ksingla.net/2010/05/goodness-of-dynamic-maxinstances-in-fastcgi/"&gt;great blog post&lt;/a&gt; on how MaxInstances can mitigate this problem.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="206"&gt;ASP.NET: turn of debug=&amp;quot;true&amp;quot; in web.config&lt;/td&gt;        &lt;td valign="top" width="374"&gt;Increased memory footprint and unoptimized code are only two of the problems you'll see if the debug flag is set to true. &lt;a href="http://weblogs.asp.net/scottgu/archive/2006/04/11/442448.aspx"&gt;ScottGu blogged about this&lt;/a&gt; a while ago. &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="206"&gt;ASP.NET: Read through the ASP.NET Performance Coding Architecture Guides&lt;/td&gt;        &lt;td valign="top" width="374"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff649152.aspx"&gt;Great book&lt;/a&gt; and also free. &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="206"&gt;ASP.NET: Read about the Large Object Heap&lt;/td&gt;        &lt;td valign="top" width="374"&gt;When I talked with the ASP.NET developers about this TechEd presentation they urged me to talk about the Large Object Heap (LOH). Every object larger than 85k goes into the LOH. The problem with the LOH is that the .NET Framework has a hard time to Garbage Collect LOH objects frequently enough in certain web scenarios, e.g. if you allocate a large object for every incoming HTTP request. Read more about the LOH &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc534993.aspx"&gt;here&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="206"&gt;ASP.Net: Use ASPNET_COMPILER to optimize for the first impression&lt;/td&gt;        &lt;td valign="top" width="374"&gt;ASP.NET applications can take a long time to start up. Due to human nature the first impression counts however. That's why the Web Platform Installer runs ASPNET_COMPILER at the end of an install of an ASP.NET application. ASPNET_COMPILER does a batch compile of all ASP.NET files and resources. This speeds up startup, especially on slow disks! More about ASPNET_COMPILER &lt;a href="http://msdn.microsoft.com/en-us/library/ms229863(VS.80).aspx"&gt;here&lt;/a&gt;.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="206"&gt;ASP.NET: Review IIS idle timeout and proactive recycling settings&lt;/td&gt;        &lt;td valign="top" width="374"&gt;Given the considerable startup time of ASP.NET applications you might want to look at the IIS recycling and idle timeout settings. IIS recycles Application Pools proactively every 29 hours. It also times out Application Pools when the site is inactive. A proactive recycle might be initiated right when you have the most traffic on your site and an idle timeout might happen just because you removed your server from the web farm for a few minutes. If you can afford it you might want to turn off idle timeout and find some better recycling settings for your ASP.NET application.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="206"&gt;ASP.NET: review Thread Pool settings&lt;/td&gt;        &lt;td valign="top" width="374"&gt;there is a setting in ASP.NET that might not work well for high throughput sites. It's the maxConcurrentRequestsPerCPU setting. It's set to 12 by default, i.e. not more than 12 concurrent requests per CPU will be executed. Usually this setting works well. We've seen instances however where a higher setting is necessary. Thomas has a &lt;a href="http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx"&gt;great blog post&lt;/a&gt; on the thread settings in IIS7.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;That's it from the Server Execution side. Now on to Network throughput. &lt;/p&gt;  &lt;h3&gt;Optimizing Network Transfer Best Practices&lt;/h3&gt;  &lt;table border="1" cellspacing="0" cellpadding="2" width="578"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="195"&gt;&lt;strong&gt;Best Practice&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="381"&gt;&lt;strong&gt;Links/Resources/Comments&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="191"&gt;Use Content Distribution Networks&lt;/td&gt;        &lt;td valign="top" width="385"&gt;Steve Souders book has a whole chapter about it. The only thing to add is that Microsoft hosts &lt;a href="http://www.asp.net/ajaxlibrary/cdn.ashx"&gt;JQuery on a CDN for you&lt;/a&gt; - free!&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="189"&gt;Use compression&lt;/td&gt;        &lt;td valign="top" width="387"&gt;There are several great articles on compression on several blogs:          &lt;br /&gt;&lt;a href="http://weblogs.asp.net/owscott/archive/2009/02/22/iis-7-compression-good-bad-how-much.aspx"&gt;Scott Forsyth's: IIS7 Compression. Good? Bad? How Much?&lt;/a&gt;           &lt;br /&gt;&lt;a href="http://blogs.iis.net/ksingla/archive/2006/06/13/changes-to-compression-in-iis7.aspx"&gt;Kanwal's &amp;quot;Changes to compression in IIS7&amp;quot;&lt;/a&gt;           &lt;br /&gt;and the IIS compression configuration reference:           &lt;br /&gt;&lt;a href="http://www.iis.net/ConfigReference/system.webServer/httpCompression"&gt;httpCompression&lt;/a&gt;           &lt;br /&gt;&lt;a href="http://www.iis.net/ConfigReference/system.webServer/urlCompression"&gt;urlCompression&lt;/a&gt;           &lt;br /&gt;          &lt;br /&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="187"&gt;Minify Javascript and CSS&lt;/td&gt;        &lt;td valign="top" width="389"&gt;Enough said in Steve Souders book. Minification tools which work well on Windows:          &lt;br /&gt;&lt;a href="http://aspnet.codeplex.com/releases/view/40584"&gt;Microsoft Ajax Minifier 4.0&lt;/a&gt;           &lt;br /&gt;&lt;a href="http://www.crockford.com/javascript/jsmin.html"&gt;JSMin by Douglas Crockford&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="186"&gt;Use Doloto for splitting the initial Javascript payload&lt;/td&gt;        &lt;td valign="top" width="390"&gt;Very well explained on the &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee423534.aspx"&gt;Doloto web site&lt;/a&gt;. No reason for me to rehash. &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="186"&gt;Do not scale images in HTML&lt;/td&gt;        &lt;td valign="top" width="390"&gt;Steve Souders &lt;a href="http://stevesouders.com/hpws/"&gt;first book&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="186"&gt;Optimize Images&lt;/td&gt;        &lt;td valign="top" width="390"&gt;Steve Souders: &lt;a href="http://stevesouders.com/efws/"&gt;Even Faster Web Sites&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="186"&gt;ASP.NET: Disable ViewState&lt;/td&gt;        &lt;td valign="top" width="390"&gt;Before you remove ViewState you should understand it. Here a &lt;a href="http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx"&gt;good start&lt;/a&gt;. Once you are sure you don't need it - &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.enableviewstate.aspx"&gt;EnableViewState=&amp;quot;false&amp;quot;&lt;/a&gt; is your friend.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="186"&gt;Use the Cache-Control header to help the browser cache&lt;/td&gt;        &lt;td valign="top" width="390"&gt;IIS allows you to set the Cache-Control header via the UI. I wrote a &lt;a href="http://blogs.iis.net/thomad/archive/2010/05/05/be-careful-when-using-the-cache-control-header-ui-in-iis-7-x.aspx"&gt;blog entry&lt;/a&gt; on how to do it a couple of weeks ago. Here is also a command-line script if using the UI is too cumbersome:           &lt;br /&gt;          &lt;div id="codeSnippetWrapper"&gt;           &lt;pre id="codeSnippet" class="csharpcode"&gt;appcmd set config &amp;quot;Default Web Site/scripts&amp;quot; &lt;br /&gt;/section:staticContent &lt;br /&gt;/clientCache&lt;span class="attr"&gt;.&lt;/span&gt;cacheControlMode:UseMaxAge&lt;br /&gt;/clientCache&lt;span class="attr"&gt;.&lt;/span&gt;cacheControlMaxAge:&amp;quot;365&lt;span class="attr"&gt;.&lt;/span&gt;00:00:00&amp;quot;&lt;br /&gt;&lt;/pre&gt;

          &lt;br /&gt;&lt;/div&gt;
In ASP.NET you can do it &lt;a href="http://quickstarts.asp.net/QuickStartv20/aspnet/doc/caching/output.aspx"&gt;programatically&lt;/a&gt; via the Response.Cache object or you can do it declaratively via the &lt;a href="http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspx"&gt;OutputCache Location=&amp;quot;Client&amp;quot;&lt;/a&gt; directive. &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="186"&gt;Avoid Redirects. If you can't use permanent redirects (301's) instead of temporary redirects (302's). &lt;/td&gt;

      &lt;td valign="top" width="390"&gt;A redirect introduces another network round-trip. Avoid it. Best described &lt;a href="http://developer.yahoo.com/performance/rules.html"&gt;here&lt;/a&gt; or in Steve Souders &lt;a href="http://www.stevesouders.com/hpws"&gt;first book&lt;/a&gt;. 

        &lt;br /&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="186"&gt;Combine Javascript and CSS&lt;/td&gt;

      &lt;td valign="top" width="390"&gt;Same as row above. &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="186"&gt;Strip unnecessary response headers&lt;/td&gt;

      &lt;td valign="top" width="390"&gt;In IIS it's easy to remove the X-Powered-By header via the UI. The ETag header is not as easy unfortunately. &lt;a href="http://www.amazon.com/Ultra-Fast-ASP-NET-Build-Ultra-Scalable-Server/dp/1430223839"&gt;&amp;quot;Ultra-Fast ASP.NET&amp;quot;&lt;/a&gt; has an example how to remove the ETag in managed code. I have code how to remove the ETag in native code for all responses. I will post it later however. It's getting really late :)&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="186"&gt;Reduce DNS Lookups&lt;/td&gt;

      &lt;td valign="top" width="390"&gt;DNS lookups introduce network roundtrips because the name has to be resolved and for that the browser needs to talk to a DNS server. Sometimes it's a good idea to use another one or two DNS names however. For static content for example. Static content doesn't need all the other stuff you might need for dynamic content, e.g. cookies. &lt;a href="http://www.stevesouders.com/"&gt;Steve Souders&lt;/a&gt; has a whole chapter about this topic. &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="186"&gt;Use authentication/SSL only when necessary&lt;/td&gt;

      &lt;td valign="top" width="390"&gt;Do you really need authentication or SSL for images or scripts? Are they really worth protecting? Authentication can introduce additional round-trips because sometimes needs a challenge response authentication dance is needed to authenticate successfully. &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="186"&gt;Use the IIS7 bandwidth throttling module if your bandwidth is misused by somebody&lt;/td&gt;

      &lt;td valign="top" width="390"&gt;Great example in &amp;quot;&lt;a href="http://www.amazon.com/Ultra-Fast-ASP-NET-Build-Ultra-Scalable-Server/dp/1430223839"&gt;Ultra-Fast ASP.NET&lt;/a&gt;&amp;quot;. You can throttle the bandwidth of a response based on the user, system load or any other criteria. Probably worth considering if you don't have unlimited bandwidth, especially if you have media content. Remember: On average only 20% of a video is usually watched by a user before he moves on to something else. If you already downloaded the full movie in this time you wasted a whole lot of bandwidth.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="186"&gt;Review Cookies and their sizes&lt;/td&gt;

      &lt;td valign="top" width="390"&gt;Cookies can get pretty big. Consider using the Cookie path feature if you can't reduce the size&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="186"&gt;ASP.NET: Keep Master Pages lean&lt;/td&gt;

      &lt;td valign="top" width="390"&gt;Master Pages are part of every response. Don't bloat them.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="186"&gt;Careful with ETags on IIS 6.0&lt;/td&gt;

      &lt;td valign="top" width="390"&gt;KB articles &lt;a href="http://support.microsoft.com/kb/922733"&gt;922733&lt;/a&gt; and &lt;a href="http://support.microsoft.com/kb/922703"&gt;922703&lt;/a&gt; explain why.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="186"&gt;Use lowercase to reference your resources&lt;/td&gt;

      &lt;td valign="top" width="390"&gt;Windows is not case-sensitive and it doesn't matter if you use lowercase, uppercase or a mix of both. The problem is the browser however. Because other OSs are case-sensitive the browser has to be case-sensitive as well. This means that it will cache multiple versions of a resource if you use different cases. 
        &lt;br /&gt;Another issue: resources compress better if lowercase is used. Why? Because most letters are lowercase. Using a smaller set of characters will produce more dictionary matches and compression is more effective. I read this is in &amp;quot;&lt;a href="http://www.amazon.com/Ultra-Fast-ASP-NET-Build-Ultra-Scalable-Server/dp/1430223839"&gt;Ultra-Fast ASP.NET&lt;/a&gt;&amp;quot;. Need to try this though!&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;Frontend Optimizations&lt;/h3&gt;

&lt;p&gt;Ok, people are leaving the bar. Need to wrap this up. Let's go:&lt;/p&gt;

&lt;table border="1" cellspacing="0" cellpadding="2" width="576"&gt;&lt;tbody&gt;
    &lt;tr&gt;
      &lt;td valign="top" width="201"&gt;&lt;strong&gt;Best Practice&lt;/strong&gt;&lt;/td&gt;

      &lt;td valign="top" width="373"&gt;&lt;strong&gt;Links/Resources/Comments&lt;/strong&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="202"&gt;Scripts should go to the bottom of the page&lt;/td&gt;

      &lt;td valign="top" width="373"&gt;Downloads of additional resources are blocked if a Javascript download is discovered. If Javascript is at the top of the page rendering of the page is probably not as fast as it could be. Responsiveness of the web application suffers. Here is the Steve Souders &lt;a href="http://stevesouders.com/hpws/rule-js-bottom.php"&gt;example page&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="202"&gt;Stylesheets on top&lt;/td&gt;

      &lt;td valign="top" width="373"&gt;Rendering can only be done once the styles are downloaded. Steve Souders &lt;a href="http://stevesouders.com/hpws/rule-css-top.php"&gt;example page&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td valign="top" width="202"&gt;Avoid CSS Expressions&lt;/td&gt;

      &lt;td valign="top" width="373"&gt;Same here: Steve Souders &lt;a href="http://stevesouders.com/hpws/rule-expr.php"&gt;example page&lt;/a&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;&lt;/table&gt;

&lt;p&gt;And now good night from New Orleans!&lt;/p&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3907747" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/j_MJAlZcs38MVoqXBPEKSWIsKoU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j_MJAlZcs38MVoqXBPEKSWIsKoU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/j_MJAlZcs38MVoqXBPEKSWIsKoU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j_MJAlZcs38MVoqXBPEKSWIsKoU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=qyJTE6mjwt8:W5jvp_4UZX8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=qyJTE6mjwt8:W5jvp_4UZX8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=qyJTE6mjwt8:W5jvp_4UZX8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=qyJTE6mjwt8:W5jvp_4UZX8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=qyJTE6mjwt8:W5jvp_4UZX8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=qyJTE6mjwt8:W5jvp_4UZX8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/qyJTE6mjwt8" height="1" width="1"/&gt;</description><feedburner:origLink>http://blogs.iis.net/thomad/archive/2010/06/07/my-web-site-is-so-slow-and-i-don-t-know-what-to-do-about-it.aspx</feedburner:origLink></item><item><title>Why unknown file types are not served by IIS</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/7D1KiJEjrfk/3gp-files-not-served-by-iis.aspx</link><pubDate>Fri, 14 May 2010 05:05:11 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3836360</guid><dc:creator>thomad</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;Quick one today. &lt;/p&gt;  &lt;p&gt;I was just trying to publish some videos that I shot with my Google Nexus One. The media format of the videos is .3gp. When I tried to watch the video on my local IIS 7.5 machine I got a detailed 404.3 error message:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/3GPFilesnotservedbyIIS_1368F/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/3GPFilesnotservedbyIIS_1368F/image_thumb.png" width="682" height="157" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I would have seen only a simple &amp;quot;404 - File Not Found&amp;quot; error if I would have made the request from a remote machine. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/3GPFilesnotservedbyIIS_1368F/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/3GPFilesnotservedbyIIS_1368F/image_thumb_1.png" width="684" height="103" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;The Problem&lt;/h2&gt;  &lt;p&gt;IIS doesn't serve unknown file extensions. It doesn't do that because IIS handler mapping is usually done based on the extension of the request. If a handler can't be matched it falls through to the static file handler which would serve the request as text. This would be a security problem because files might be returned as text that should be executed as script (e.g. ASP, ASP.NET or PHP files) but not be returned as text. Here is a real-world example:&lt;/p&gt;  &lt;p&gt;Let's assume you uninstalled PHP or ASP.NET but you still have some ASP.NET files or PHP files in your IIS directories. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Problem #1: PHP or ASP.NET files contain &lt;u&gt;your&lt;/u&gt; &lt;u&gt;code&lt;/u&gt; (i.e. your intellectual property). You don't want to reveal your superior coding skills to others, do you? &lt;/li&gt;    &lt;li&gt;Problem #2: Often times scripts or code contains passwords, fore example to a database. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;It wouldn't be a good idea for the static file handler to serve these files as text. And that's why the &amp;quot;don't serve unknown file extensions&amp;quot; feature exists. &lt;/p&gt;  &lt;p&gt;Now let's get back to my problem. In order to serve .3gp files I simply added a Mime Type entry to the static file handler section that tells it about the file extension and it's Mime Type. Here is the command: &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;%windir%\system32\inetsrv\appcmd set config /section:staticContent /+&amp;quot;[fileExtension='&lt;/strong&gt;&lt;strong&gt;.3gp&lt;/strong&gt;&lt;strong&gt;',mimeType='&lt;/strong&gt;&lt;strong&gt;video/3gpp&lt;/strong&gt;&lt;strong&gt;']&amp;quot;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;And while we are at it. You might run into the same problem with MP4 files. Here is the appcmd for it:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;%windir%\system32\inetsrv\appcmd set config /section:staticContent /+&amp;quot;[fileExtension='&lt;/strong&gt;&lt;strong&gt;.mp4&lt;/strong&gt;&lt;strong&gt;',mimeType='&lt;/strong&gt;&lt;strong&gt;video/mpeg&lt;/strong&gt;&lt;strong&gt;']&amp;quot;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h2&gt;More Details&lt;/h2&gt;  &lt;p&gt;Here are some additional links in case you need more details on how to add Mime Types in IIS 6.0 or IIS 7.x. &lt;/p&gt;  &lt;p&gt;IIS 6.0: &lt;a title="http://support.microsoft.com/kb/326965" href="http://support.microsoft.com/kb/326965"&gt;http://support.microsoft.com/kb/326965&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;IIS 7.0 and 7.5: &lt;a title="http://technet.microsoft.com/en-us/library/cc725608(WS.10).aspx" href="http://technet.microsoft.com/en-us/library/cc725608(WS.10).aspx"&gt;http://technet.microsoft.com/en-us/library/cc725608(WS.10).aspx&lt;/a&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2405f056-a055-4f17-a670-07a0fac70108" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/3GP" rel="tag"&gt;3GP&lt;/a&gt;,&lt;a href="http://technorati.com/tags/404.3" rel="tag"&gt;404.3&lt;/a&gt;,&lt;a href="http://technorati.com/tags/404" rel="tag"&gt;404&lt;/a&gt;,&lt;a href="http://technorati.com/tags/IIS7" rel="tag"&gt;IIS7&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Mime+Types" rel="tag"&gt;Mime Types&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Mime" rel="tag"&gt;Mime&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3836360" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XjRebCRrsstSuQyIjH5Ki2ByeXA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XjRebCRrsstSuQyIjH5Ki2ByeXA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XjRebCRrsstSuQyIjH5Ki2ByeXA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XjRebCRrsstSuQyIjH5Ki2ByeXA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=7D1KiJEjrfk:603Tmsi15RM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=7D1KiJEjrfk:603Tmsi15RM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=7D1KiJEjrfk:603Tmsi15RM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=7D1KiJEjrfk:603Tmsi15RM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=7D1KiJEjrfk:603Tmsi15RM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=7D1KiJEjrfk:603Tmsi15RM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/7D1KiJEjrfk" height="1" width="1"/&gt;</description><category domain="http://blogs.iis.net/thomad/archive/tags/MP4/default.aspx">MP4</category><feedburner:origLink>http://blogs.iis.net/thomad/archive/2010/05/13/3gp-files-not-served-by-iis.aspx</feedburner:origLink></item><item><title>WCAT Fiddler Extension for Web Server Performance Tests</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/Hb0OdoSs03o/using-the-wcat-fiddler-extension-for-web-server-performance-tests.aspx</link><pubDate>Wed, 12 May 2010 06:14:06 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3831206</guid><dc:creator>thomad</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;For web server performance testing the Microsoft Web Capacity Analysis Tool (&lt;a href="http://www.iis.net/community/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1467" target="_blank"&gt;WCAT&lt;/a&gt;) is the tool of choice of the IIS team as well as the Windows Performance Team. Simple tests that hammer IIS with thousands of requests to the same HTTP page to very sophisticated web hosting and benchmark scenarios - there is nothing that &lt;a href="http://www.iis.net/community/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1467" target="_blank"&gt;WCAT&lt;/a&gt; can't do. Even on ApacheCon I heard some hard-core Apache guys talking about using &lt;a href="http://www.iis.net/community/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1467" target="_blank"&gt;WCAT&lt;/a&gt; for their performance tests. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.iis.net/community/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1467" target="_blank"&gt;WCAT&lt;/a&gt; is extremely versatile and can simulate thousands of concurrent users making requests to a single web site or multiple web sites.&amp;#160; The WCAT engine uses a simple script to define the set of HTTP requests to be played back to the web server. Extensibility is provided through plug-in DLLs and a simple API. &lt;a href="http://www.iis.net/community/default.aspx?tabid=34&amp;amp;g=6&amp;amp;i=1467" target="_blank"&gt;WCAT&lt;/a&gt; is the best tool to hammer your web server with requests and make it really sweat.&lt;/p&gt;  &lt;p&gt;Writing a WCAT script is not rocket science. However, writing a WCAT script to replay client requests is a lot of work because all hyperlinks and other resources have to be added manually. Lot's of typing… So I thought I write a Fiddler extension that does the work (download &lt;a href="http://blogs.iis.net/blogs/thomad/wcatfiddler.zip" target="_blank"&gt;here&lt;/a&gt;). To use it is simple. Selecting a set of requests in the Fiddler UI and clicking the &amp;quot;Run WCAT script for selected sessions&amp;quot; in the context menu will do the trick. The WCAT Fiddler extension will then generate a WCAT script from the selected sessions and run the selected requests as a WCAT transaction against the configured server. Once the test is over it will show the results using the built-in reporting page. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_8.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_thumb_3.png" width="234" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;WCAT Fiddler Extension Details&lt;/h2&gt;  &lt;p&gt;After you installed the WCAT Fiddler Extension you get two additional menu items in Fiddler. The first one is the &amp;quot;Configure WCAT Run&amp;quot; menu item in the &amp;quot;Tools&amp;quot; menu. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_6.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_thumb_2.png" width="244" height="210" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In the configuration dialog below you can configure the following: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_thumb_1.png" width="244" height="204" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;strong&gt;Server Name        &lt;br /&gt;&lt;/strong&gt;This might look a little weird given that the server name could be inferred from the host name used in the selected sessions. WCAT is a server performance tool though and for this reason it will run the selected sessions only against the server that is specified in this dialog. The WCAT Fiddler extension uses localhost as the default. So even if sessions get selected that Internet Explorer requested from a remote web server, e.g. &lt;a href="http://www.microsoft.com"&gt;www.microsoft.com&lt;/a&gt;, WCAT will establish a connection with the WCAT-specified server and run the &lt;a href="http://www.microsoft.com"&gt;www.microsoft.com&lt;/a&gt; requests against it (i.e. the host header will say &lt;a href="http://www.microsoft.com"&gt;www.microsoft.com&lt;/a&gt; but the server that receives the request is the local machine. WCAT will also not use the Internet Explorer HTTP interfaces to make its requests. It's using its own infrastructure. WCAT requests won't show up in Fiddler nor can a proxy server be used with WCAT. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Virtual Clients        &lt;br /&gt;&lt;/strong&gt;WCAT has a controller/client architecture that allows multiple physical machines (clients) to team up and send requests against a single web server. For the WCAT Fiddler Extension this feature is not used. The WCAT Configuration dialog allows the configuration of virtual clients however. Virtual Clients are the number of concurrent threads that the WCAT Client will use to send request against the web server. One thing to remember: the default configuration uses the local machine as the WCAT client as well as the WCAT server. Both need resources (CPU/memory) and performance tests will definitely be skewed by running client and server on the same machine. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Duration&lt;/strong&gt;       &lt;br /&gt;The duration of the test. Default is 30 seconds. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Warm-up time        &lt;br /&gt;&lt;/strong&gt;The time WCAT gives the web server to warm-up its caches. After the warm-up time will release the throttle and send everything it has against the web server. &lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;Run WCAT script for selected sessions&lt;/h2&gt;  &lt;p&gt;The second menu item is available in Fiddler's context menu.    &lt;br /&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_thumb_3.png" width="297" height="310" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The following happens if the menu &amp;quot;Run WCAT script for selected sessions&amp;quot; is clicked: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;The code checks if WCAT is installed. It show message if not and returns. &lt;/li&gt;    &lt;li&gt;It iterates through all selected sessions and writes a WCAT script file to the temp directory (scripts can be found via &amp;quot;dir %temp%\*.wcat). &lt;/li&gt;    &lt;li&gt;It starts a WCAT controller and a WCAT client which executes the WCAT script using the parameters configured in the WCAT Configuration dialog.     &lt;br /&gt;&amp;#160;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_12.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_thumb_5.png" width="283" height="145" /&gt;&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;After the test completes the results are displayed in Internet Explorer (results file can be found via &amp;quot;dir %temp%\*.wcat.xml&amp;quot;). &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_16.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_thumb_7.png" width="418" height="194" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Results&lt;/h2&gt;  &lt;p&gt;There is a lot of interesting data in the WCAT results page. The two most important are shown in the summary. Requests/sec is pretty obvious. &amp;quot;Transactions per Second&amp;quot; is not hard to understand either. The generated WCAT script puts the selected Fiddler sessions in a so-called transaction. WCAT executes all requests of a given transaction before it starts a new one. So &amp;quot;Transactions per Second&amp;quot; is the number of these selected Fiddler sessions that were handled per second. These two results give a rough ballpark figure how fast your web server runs. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_18.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_thumb_8.png" width="244" height="210" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The results have to be taken with a grain of salt. There are many things to look at before these numbers will reflect the maximum of what your web server can handle. For example:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;the WCAT client will consume CPU cycles if you run the WCAT client on the same machine as your web server&lt;/li&gt;    &lt;li&gt;the network might be maxed out and not be able to send more data&lt;/li&gt;    &lt;li&gt;the virtual clients you configured might not be able to generate enough traffic for the web server&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I will follow up with another post discussing how to properly test web server performance. &lt;/p&gt;  &lt;h2&gt;Known Issues:&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;To show WCAT Reports in Internet Explorer WCAT's reports.XSL File is needed. Unfortunately it needs to run scripts and shows the following dialog:      &lt;br /&gt;&amp;#160;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_14.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/UsingFiddlerforWCATPerformanceTests_13146/image_thumb_6.png" width="244" height="105" /&gt;&lt;/a&gt;       &lt;br /&gt;The dialog sometimes ends up in the background and IE appears to hang.       &lt;br /&gt;&lt;strong&gt;SOLUTION:&lt;/strong&gt; Just TAB through your windows and click &amp;quot;OK&amp;quot; once you find the dialog. &lt;/li&gt;    &lt;li&gt;Currently only GET requests are supported by the WCAT Fiddler Extension. &lt;/li&gt;    &lt;li&gt;I'm pretty new to writing installers. The MSI installer puts the WCAT Fiddler Extension in the c:\Users\&amp;lt;username&amp;gt;\My Documents\fiddler2\scripts directory. No messages, no dialogs. It just does it. &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3831206" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-m0SOz6ZnnJLGo1TwaOdX3T7u3o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-m0SOz6ZnnJLGo1TwaOdX3T7u3o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-m0SOz6ZnnJLGo1TwaOdX3T7u3o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-m0SOz6ZnnJLGo1TwaOdX3T7u3o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Hb0OdoSs03o:gYjf9MabXZw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Hb0OdoSs03o:gYjf9MabXZw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=Hb0OdoSs03o:gYjf9MabXZw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Hb0OdoSs03o:gYjf9MabXZw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=Hb0OdoSs03o:gYjf9MabXZw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Hb0OdoSs03o:gYjf9MabXZw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/Hb0OdoSs03o" height="1" width="1"/&gt;</description><feedburner:origLink>http://blogs.iis.net/thomad/archive/2010/05/11/using-the-wcat-fiddler-extension-for-web-server-performance-tests.aspx</feedburner:origLink></item><item><title>Careful when using the Cache-Control Header UI in IIS 7.x!</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/eDz74I87REM/be-careful-when-using-the-cache-control-header-ui-in-iis-7-x.aspx</link><pubDate>Thu, 06 May 2010 06:19:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3821050</guid><dc:creator>thomad</dc:creator><slash:comments>1</slash:comments><description>&lt;P&gt;I was just reading &lt;A href="http://blogs.msdn.com/ieinternals/archive/2010/01/26/Use-Max-Age-values-less-than-MaxInt.aspx" target=_blank mce_href="http://blogs.msdn.com/ieinternals/archive/2010/01/26/Use-Max-Age-values-less-than-MaxInt.aspx"&gt;Eric Lawrence's blog on Cache headers&lt;/A&gt;. In it Eric describes that it's necessary to use sensible values for the Max-Age headers because IE and several browsers don't like values greater than the size of a signed 32-Bit Integer, i.e. 2,147,483,647. Bigger values result in the content not being cached at all. Using the max 32-Bit integer value (2,147,483,647) is more than enough though. It caches the content for more than 68 years (max-age is using seconds so you divide 2,147,483,647 by 60 seconds by 60 minutes by 24 hours by 365 days which gets us to 68 years). &lt;/P&gt;
&lt;P&gt;As an IIS guy I asked myself if the IIS User Interface does the right thing when it comes to this header. Unfortunately it doesn't. &lt;/P&gt;
&lt;H2&gt;Cache-Control User Interface&lt;/H2&gt;
&lt;P&gt;The Cache-Control User Interface is somewhat hidden behind the "HTTP Response Headers" icon. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_6.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_6.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_thumb_2.png" width=244 height=161 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Clicking the icon shows existing response headers in the center. It offers the "Actions" menu on the right side. By clicking "Set Common Headers" the resulting dialog page will allow the configuration of the Cache-Control headers. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_4.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_4.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_thumb_1.png" width=197 height=107 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_thumb_1.png"&gt;&lt;/A&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_2.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_thumb.png" width=244 height=154 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_thumb.png"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;The Cache-Control dialog allows the configuration in seconds, minutes, hours or days. The value is stored as a &lt;A href="http://msdn.microsoft.com/en-us/library/system.timespan.maxvalue.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/system.timespan.maxvalue.aspx"&gt;timespan&lt;/A&gt; value in the IIS configuration system. In a perfect world the IIS User Interface would only allow values up to the magic 2 million (max 32-Bit signed integer) so that all browsers understand the max-age value. The world is not perfect though :(. The underlying base data type for a timespan value is a 64-Bit integer representing &lt;A href="http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx"&gt;ticks&lt;/A&gt; (one tick is hundred nanoseconds, i.e. a millisecond has 10,000 ticks). The Cache-Control dialog allows values up to the max value of the timespan data type. The max is 922,337,203,685 seconds, i.e. roughly 15 billion minutes or 256 million hours or 10 million days or roughly 29247 years. &lt;STRONG&gt;Values far bigger than what web browsers understand in a Cache-Control header!&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_8.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_8.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_thumb_3.png" width=244 height=89 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/BecarefulwhenusingtheCacheControlHeade.x_139D9/image_thumb_3.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;What the IIS run-time does with large timespan values&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;When the underlying IIS run-time reads the max-age timespan value it converts it to an &lt;STRONG&gt;unsigned 32-Bit&lt;/STRONG&gt;&amp;nbsp;&lt;STRONG&gt;integer - no questions asked.&lt;/STRONG&gt; This doesn't work too well for two reasons:&lt;/P&gt;
&lt;P&gt;1) Large timespan's simply don't fit into a 32-Bit integer and we end up doing a modulo operation. Using the max value for seconds (922,337,203,685) for example will set the max-age header value to 3,214,202,341 which is 922,337,203,685 mod 4,294,967,295.&lt;/P&gt;
&lt;P&gt;2) Due to the issues Eric described in his &lt;A href="http://blogs.msdn.com/ieinternals/archive/2010/01/26/Use-Max-Age-values-less-than-MaxInt.aspx" target=_blank mce_href="http://blogs.msdn.com/ieinternals/archive/2010/01/26/Use-Max-Age-values-less-than-MaxInt.aspx"&gt;blog post&lt;/A&gt; the IIS run-time should not set the header if the value is larger than a 32-Bit &lt;STRONG&gt;signed&lt;/STRONG&gt; integer.&amp;nbsp;&amp;nbsp; &lt;/P&gt;
&lt;P&gt;We'll fix this issue in future IIS version - but until then Eric's advise holds true: &lt;A href="http://blogs.msdn.com/ieinternals/archive/2010/01/26/Use-Max-Age-values-less-than-MaxInt.aspx" target=_blank mce_href="http://blogs.msdn.com/ieinternals/archive/2010/01/26/Use-Max-Age-values-less-than-MaxInt.aspx"&gt;use sensible values for your cache headers!&lt;/A&gt;&lt;/P&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3821050" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/56fsq3ZsiXAviZ0QDTT3KL8lfwA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/56fsq3ZsiXAviZ0QDTT3KL8lfwA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/56fsq3ZsiXAviZ0QDTT3KL8lfwA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/56fsq3ZsiXAviZ0QDTT3KL8lfwA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=eDz74I87REM:TcC9qNbzZLc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=eDz74I87REM:TcC9qNbzZLc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=eDz74I87REM:TcC9qNbzZLc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=eDz74I87REM:TcC9qNbzZLc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=eDz74I87REM:TcC9qNbzZLc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=eDz74I87REM:TcC9qNbzZLc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/eDz74I87REM" height="1" width="1"/&gt;</description><category domain="http://blogs.iis.net/thomad/archive/tags/max-age/default.aspx">max-age</category><category domain="http://blogs.iis.net/thomad/archive/tags/Eric+Lawrence/default.aspx">Eric Lawrence</category><category domain="http://blogs.iis.net/thomad/archive/tags/Cache-Control/default.aspx">Cache-Control</category><feedburner:origLink>http://blogs.iis.net/thomad/archive/2010/05/05/be-careful-when-using-the-cache-control-header-ui-in-iis-7-x.aspx</feedburner:origLink></item><item><title>Running Wordpress on MariaDB on Windows</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/-mOm5YLNesM/running-wordpress-on-mariadb-on-windows.aspx</link><pubDate>Sun, 25 Apr 2010 13:18:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3802986</guid><dc:creator>thomad</dc:creator><slash:comments>1</slash:comments><description>&lt;P&gt;You might have read that the &lt;A href="http://mysql.com/?bydis_dis_index=1" target=_blank mce_href="http://mysql.com/?bydis_dis_index=1"&gt;MySQL&lt;/A&gt; codebase was forked. The &lt;A href="http://mysql.com/?bydis_dis_index=1" target=_blank mce_href="http://mysql.com/?bydis_dis_index=1"&gt;MySQL&lt;/A&gt; founder, &lt;A href="http://askmonty.org/wiki/Main_Page" target=_blank mce_href="http://askmonty.org/wiki/Main_Page"&gt;Monty Widenius&lt;/A&gt;, is - how should we say it - not quite happy with the direction &lt;A href="http://mysql.com/?bydis_dis_index=1" target=_blank mce_href="http://mysql.com/?bydis_dis_index=1"&gt;MySQL&lt;/A&gt; is going after the &lt;A href="http://www.informationweek.com/news/software/database_apps/showArticle.jhtml?articleID=217000007" target=_blank mce_href="http://www.informationweek.com/news/software/database_apps/showArticle.jhtml?articleID=217000007"&gt;Oracle acquisition&lt;/A&gt;. So Monty and his team forked &lt;A href="http://mysql.com/?bydis_dis_index=1" target=_blank mce_href="http://mysql.com/?bydis_dis_index=1"&gt;MySQL&lt;/A&gt; and called his branch &lt;A href="http://www.mariadb.com/" target=_blank mce_href="http://www.mariadb.com"&gt;MariaDB&lt;/A&gt; after his youngest daughter. &lt;/P&gt;
&lt;P&gt;I wanted to check out &lt;A href="http://www.askmonty.org/" target=_blank mce_href="http://www.askmonty.org"&gt;MariaDB&lt;/A&gt;, running &lt;A href="http://www.wordpress.org/" target=_blank mce_href="http://www.wordpress.org"&gt;Wordpress&lt;/A&gt; with &lt;A href="http://www.askmonty.org/" target=_blank mce_href="http://www.askmonty.org"&gt;MariaDB&lt;/A&gt; on Windows. Not a problem. All I had to do was to trick &lt;A href="http://www.microsoft.com/web/downloads/platform.aspx" target=_blank mce_href="http://www.microsoft.com/web/downloads/platform.aspx"&gt;Web Platform Installer&lt;/A&gt; into thinking that &lt;A href="http://mysql.com/?bydis_dis_index=1" target=_blank mce_href="http://mysql.com/?bydis_dis_index=1"&gt;MySQL&lt;/A&gt; is already installed. &lt;/P&gt;
&lt;P&gt;Here step-by-step on how you do it:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;MariaDB Installation&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;MySQL and MariaDB can probably run side-by-side. That would make the installation and configuration more complex however and that's why I'd recommend you simply uninstall MySQL. You can do this by going to the Control Panel and select "Uninstall Programs". Pick MySQL and uninstall it. &lt;/LI&gt;
&lt;LI&gt;Setup of MariaDB is pretty easy although no Windows Installer (.MSI) is available yet. For my install I downloaded the &lt;A href="http://askmonty.org/downloads/r/http://mariadb.cdn.cacheboy.net/download/mariadb-noinstall-5.1.39-beta-win32/mariadb-noinstall-5.1.39-beta-win32.zip" target=_blank mce_href="http://askmonty.org/downloads/r/http://mariadb.cdn.cacheboy.net/download/mariadb-noinstall-5.1.39-beta-win32/mariadb-noinstall-5.1.39-beta-win32.zip"&gt;MariaDB version 5.1.39&lt;/A&gt; bits. When you read this you might want to check &lt;A href="http://www.askmonty.org/" mce_href="http://www.askmonty.org"&gt;www.askmonty.org&lt;/A&gt; for newer version. Copy the contents of the zip file into a dedicated directory, e.g. c:\mariadb. &lt;/LI&gt;
&lt;LI&gt;Start a command shell (&lt;A href="http://windows.microsoft.com/en-us/windows-vista/What-is-User-Account-Control" target=_blank mce_href="http://windows.microsoft.com/en-us/windows-vista/What-is-User-Account-Control"&gt;elevate to Administrator&lt;/A&gt; on Windows 7 or Vista) and run "&lt;STRONG&gt;mysqld.exe --install&lt;/STRONG&gt;". mysqld.exe can be found in the bin directory, e.g. c:\mariadb\bin. This will install MariaDB as a Windows System Service. &lt;/LI&gt;
&lt;LI&gt;Start the MariaDB service by executing the command: &lt;STRONG&gt;net start mysql&lt;/STRONG&gt; &lt;BR&gt;MariaDB is now running. &lt;/LI&gt;
&lt;LI&gt;There is no root password for MariaDB yet and that's why I would recommend you configure one. &lt;EM&gt;Later on Web Platform Installer will ask you for the root password you configured here!&lt;/EM&gt; &lt;BR&gt;Start mysqladmin with the following arguments: &lt;BR&gt;&lt;STRONG&gt;mysqladmin.exe -u root password &amp;lt;your supersecure password&amp;gt; &lt;BR&gt;&lt;/STRONG&gt;Like mysqld.exe mysqladmin.exe can be found in the bin directory. Time to get Wordpress installed. &lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;Tricking Web Platform Installer&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Web Platform Installer (WebPI) does an extensive dependency check on startup to figure out what products are already installed and which products might still need to install. Because Wordpress depends on MySQL we have to trick WebPI so that it thinks MySQL is aleady installed. If you peak into the WebPI RSS feed you see that it checks for a MySQL install by checking for a reg key &lt;BR&gt;HKEY_LOCAL_MACHINE\SOFTWARE\MySQL AB\MySQL Server 5.1 &lt;BR&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/RunningWordpressonMariaDBonWindows_EAC9/image_2.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/RunningWordpressonMariaDBonWindows_EAC9/image_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/RunningWordpressonMariaDBonWindows_EAC9/image_thumb.png" width=402 height=138 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/RunningWordpressonMariaDBonWindows_EAC9/image_thumb.png"&gt;&lt;/A&gt;&amp;nbsp; &lt;BR&gt;On 64-Bit versions of the OS it also checks for a potential 32-Bit install of MySql against the reg key &lt;BR&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MySQL AB\MySQL Server 5.1 &lt;BR&gt;Let's simply set the registry key with the following command: &lt;STRONG&gt;reg add "HKLM\SOFTWARE\MySQL AB\MySQL Server 5.1"&lt;/STRONG&gt;. Now WebPI will be convinced that MySQL is already installed.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Installing Wordpress&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Installing Wordpress is easy. Just start WebPI and click Wordpress. For a little more handholding refer to &lt;A href="http://blogs.iis.net/richma/archive/2009/12/30/installing-word-press-on-iis-using-the-web-platform-installer-webpi.aspx" target=_blank mce_href="http://blogs.iis.net/richma/archive/2009/12/30/installing-word-press-on-iis-using-the-web-platform-installer-webpi.aspx"&gt;Richard Marr's blog&lt;/A&gt;. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/RunningWordpressonMariaDBonWindows_EAC9/image_4.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/RunningWordpressonMariaDBonWindows_EAC9/image_4.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/RunningWordpressonMariaDBonWindows_EAC9/image_thumb_1.png" width=244 height=89 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/RunningWordpressonMariaDBonWindows_EAC9/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Simple, wasn't it? &lt;/P&gt;
&lt;DIV style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; FLOAT: none; PADDING-TOP: 0px" id=scid:0767317B-992E-4b12-91E0-4F059A8CECA8:18974a96-7b1d-44e7-8b47-9325927c463d class=wlWriterEditableSmartContent&gt;Technorati Tags: &lt;A href="http://technorati.com/tags/Wordpress" rel=tag mce_href="http://technorati.com/tags/Wordpress"&gt;Wordpress&lt;/A&gt;,&lt;A href="http://technorati.com/tags/MariaDB" rel=tag mce_href="http://technorati.com/tags/MariaDB"&gt;MariaDB&lt;/A&gt;,&lt;A href="http://technorati.com/tags/Web+Platform+Installer" rel=tag mce_href="http://technorati.com/tags/Web+Platform+Installer"&gt;Web Platform Installer&lt;/A&gt;&lt;/DIV&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3802986" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/imj1qALNrP0u-bjaF-eECcBS4Qw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/imj1qALNrP0u-bjaF-eECcBS4Qw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/imj1qALNrP0u-bjaF-eECcBS4Qw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/imj1qALNrP0u-bjaF-eECcBS4Qw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=-mOm5YLNesM:yPMt43Qj6N8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=-mOm5YLNesM:yPMt43Qj6N8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=-mOm5YLNesM:yPMt43Qj6N8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=-mOm5YLNesM:yPMt43Qj6N8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=-mOm5YLNesM:yPMt43Qj6N8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=-mOm5YLNesM:yPMt43Qj6N8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/-mOm5YLNesM" height="1" width="1"/&gt;</description><category domain="http://blogs.iis.net/thomad/archive/tags/Wordpress/default.aspx">Wordpress</category><category domain="http://blogs.iis.net/thomad/archive/tags/Web+Platform+Installer/default.aspx">Web Platform Installer</category><category domain="http://blogs.iis.net/thomad/archive/tags/MariaDB/default.aspx">MariaDB</category><category domain="http://blogs.iis.net/thomad/archive/tags/MySql/default.aspx">MySql</category><feedburner:origLink>http://blogs.iis.net/thomad/archive/2010/04/25/running-wordpress-on-mariadb-on-windows.aspx</feedburner:origLink></item><item><title>Setting up SSL made easy…</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/rasKzW_hky0/setting-up-ssl-made-easy.aspx</link><pubDate>Fri, 16 Apr 2010 07:42:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3788046</guid><dc:creator>thomad</dc:creator><slash:comments>1</slash:comments><description>&lt;P&gt;This blog post is about a small tool I just finished. It makes configuring and using SSL much easier. In the first part of the blog post I quickly review the problems and difficulties you run into when setting up SSL. Then I introduce SELFSSL7 and finally walk through several usage scenarios. &lt;/P&gt;
&lt;H2&gt;Setting up SSL - what a pain!&lt;/H2&gt;
&lt;P&gt;I'm sometimes amazed how hard seemingly simple things still are. Take SSL as an example. Shouldn't setting up SSL be easier than what's shown in the walkthrough on &lt;A href="http://learn.iis.net/page.aspx/144/how-to-setup-ssl-on-iis-7/" target=_blank mce_href="http://learn.iis.net/page.aspx/144/how-to-setup-ssl-on-iis-7/"&gt;how to set up SSL&lt;/A&gt; in IIS7.&amp;nbsp;Here are the typical steps you have to go&amp;nbsp;through before you can&amp;nbsp;access your SSL site. &amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Steps to set up SSL&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Generate a certificate request&lt;/LI&gt;
&lt;LI&gt;Send the request to a Certificate Authority&lt;/LI&gt;
&lt;LI&gt;Wait until the certificate is returned to you&lt;/LI&gt;
&lt;LI&gt;Install the certificate and finally &lt;/LI&gt;
&lt;LI&gt;you need to add a SSL binding in IIS&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Once you've completed all of these steps you are able to use the magic "http&lt;STRONG&gt;s&lt;/STRONG&gt;" prefix to browse to your web-site. There are all kinds of things that can go wrong during these steps not to talk about the time it takes until you finally have SSL working. It's certainly a royal pain if you want to do that on your local dev box. &lt;/P&gt;
&lt;H3&gt;Self-signed certificates&lt;/H3&gt;
&lt;P&gt;IIS7 made it much easier by allowing you to create a self-signed certificate and use this certificate for your SSL site. But there are still issues, for example TRUST. &lt;/P&gt;
&lt;P&gt;As soon as you are using self-signed certificates Internet Explorer will complain that it doesn't trust the certificate: &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_2.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_2.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb.png" width=492 height=220 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;Firefox will do the same:&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_4.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_4.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_1.png" width=289 height=243 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_1.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;H3&gt;Establishing trust between your browser and your web server&lt;/H3&gt;
&lt;P mce_keep="true"&gt;When a web browser like Firefox or Internet Explorer receive a SSL certificate from the server it usually checks the certificate for the following three things:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Is the certificate still valid or is it already expired?&lt;/LI&gt;
&lt;LI&gt;Is the common name of the certificate the same as the user entered in the browsers address bar?&lt;/LI&gt;
&lt;LI&gt;Does the browser trust the certificate or the issuer of the certificate?&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Checking for #1 and #2 are pretty straightforward. For #1 the browser simply compares the current date with the expiration date of the certificate. The browser complains if the current date is already past the expiration date of the certificate. Checking #2 is easy, too. Compare the address entered in the address bar with the "common name" property in the certificate. If the name doesn't match the browser will complain. Checking for trust is a bit trickier. All browsers have a list of baked-in certificates (Trusted Root Certificates). The browser will complain if the SSL certificate IIS sends you is not a descendant from one of these Trusted Root Certificates. Here is the list of Trusted Root Certificate Authorities" that Internet Explorer uses ("Tools" - "Internet Options" - "Content" - "Certificates" - select the "Trusted Root Certification Authorities" tab). &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_6.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_6.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_2.png" width=367 height=248 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_2.png"&gt;&lt;/A&gt; &lt;/P&gt;
&lt;H3&gt;The problem with IIS7 self-signed certificates&lt;/H3&gt;
&lt;P&gt;IIS7 introduced a new feature which allows you to create a self-signed certificate that can be used for SSL. Problem is that it is a bit limited in what you can do with it. &lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;The common name is always the machine name of your IIS server. &lt;/LI&gt;
&lt;LI&gt;The certificate is only valid for one week.&lt;/LI&gt;
&lt;LI&gt;The certificate is not added to the "Trusted Root Certificate Authorities" of any browser. Not even on your local machine. You need to export the certificate to a file and import it back in so that it can be added to the "Trusted Root Certificate Authorities". &lt;/LI&gt;&lt;/OL&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;SCRIPT type=text/javascript&gt;&lt;!--
google_ad_client = "pub-9078059873960348";
/* 234x60, created 4/16/10 */
google_ad_slot = "9545943537";
google_ad_width = 234;
google_ad_height = 60;
//--&gt;
&lt;/SCRIPT&gt;

&lt;SCRIPT type=text/javascript src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/SCRIPT&gt;

&lt;H2&gt;Here comes &lt;A href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip" target=_blank mce_href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip"&gt;SelfSSL7&lt;/A&gt;!&lt;/H2&gt;
&lt;P&gt;SelfSSL.exe was a tool that we shipped as part of the IIS6 Resource Kit. By simply executing it you got the full monty: &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;a self-signed certificate with a configurable common name and a configurable expiration date&lt;/LI&gt;
&lt;LI&gt;an IIS SSL binding &lt;/LI&gt;
&lt;LI&gt;and SelfSSL also added the self-signed certificate to the "Trusted Root Certificate Authorities" list so that #3 didn't get in your way &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;SelfSSL still works if you have "IIS6 Management Compatibility". It was time however to rewrite this tool for IIS7 and to add some features to it. &lt;/P&gt;
&lt;H3&gt;What &lt;A href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip" target=_blank mce_href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip"&gt;SelfSSL7&lt;/A&gt; offers:&lt;/H3&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip" target=_blank mce_href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip"&gt;SelfSSL7&lt;/A&gt; creates self-signed certificates with &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;one or more configurable common name&lt;/LI&gt;
&lt;LI&gt;a configurable expiration date&lt;/LI&gt;
&lt;LI&gt;a configurable key size&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip" target=_blank mce_href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip"&gt;SelfSSL7&lt;/A&gt; also allows you to add a SSL bindings in IIS. Configurable are&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;the site name SSL is to be configured on&lt;/LI&gt;
&lt;LI&gt;the IP address&lt;/LI&gt;
&lt;LI&gt;the port&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;When the /T parameter is specified the self-signed certificate is added to the "Trusted Root Certificate Authorities" of the current user which will make the certificate trusted and Internet Explorer won't complain anymore. &lt;/P&gt;
&lt;P&gt;And best of all: &lt;A href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip" target=_blank mce_href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip"&gt;SelfSSL7&lt;/A&gt; has intelligent defaults, i.e. you only have to enter &lt;A href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip" target=_blank mce_href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip"&gt;SELFSSL7.EXE&lt;/A&gt; and it will do the work for you to set up a fully functioning SSL for your local IIS7 machine. &lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip" target=_blank mce_href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip"&gt;SelfSSL7&lt;/A&gt; can also export the self-signed certificate to a password protected PFX file. This allows you to import the certificate on another machine which then can also trust the self-signed certificate. &lt;/P&gt;
&lt;H2&gt;Examples and Usage&lt;/H2&gt;
&lt;OL&gt;
&lt;LI&gt;Let's start with the command-line help by entering "SELFSSL7.EXE /?": &lt;BR&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_8.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_8.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_3.png" width=442 height=210 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_3.png"&gt;&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;Configure SSL on the local machine and make the SSL certificate trusted for the local user: &lt;BR&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_10.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_10.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_4.png" width=444 height=42 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_4.png"&gt;&lt;/A&gt;&amp;nbsp; &lt;BR&gt;Defaults are used to configure the IIS binding and make the certificate trusted in the user's root certificate authorities store. With this you should be able to enter &lt;A href="https://%3cmachinename/" mce_href="https://&lt;machinename"&gt;https://&amp;lt;machinename&lt;/A&gt;&amp;gt; without getting a certificate warning. &lt;/LI&gt;
&lt;LI&gt;Configure new SSL certificate that also works for &lt;A href="https://localhost.&amp;nbsp;" mce_href="https://localhost.&amp;nbsp;"&gt;https://localhost. &lt;/A&gt;Overwrite IIS binding that we configured in 2) &lt;BR&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_12.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_12.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_5.png" width=449 height=41 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_5.png"&gt;&lt;/A&gt;&amp;nbsp; &lt;BR&gt;I use &lt;BR&gt;/Q to overwrite existing IIS SSL bindings &lt;BR&gt;/T to add the certificate also to the user's certificate store so the SSL certificate is trusted by IE &lt;BR&gt;/I to add an IIS binding &lt;BR&gt;/S specifies the site we want to use to add the binding &lt;BR&gt;/N specifies two common names: IIS7BRICK is my machine name and LOCALHOST is the local loopback adapter name &lt;BR&gt;You should be able to browse to &lt;A href="https://localhost/" mce_href="https://localhost"&gt;https://localhost&lt;/A&gt; and https://&amp;lt;machinename&amp;gt; without getting security warnings from Internet Explorer. If you click the the little lock at the right side of Internet Explorer's address bar &lt;BR&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_16.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_16.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_7.png" width=244 height=62 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_7.png"&gt;&lt;/A&gt;&amp;nbsp; &lt;BR&gt;you can find the properties of the certificate we just created, e.g. the validity dates, the common names and the key size (1024 Bit). &lt;BR&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_18.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_18.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_8.png" width=244 height=189 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_8.png"&gt;&lt;/A&gt;&amp;nbsp; &lt;/LI&gt;
&lt;LI&gt;Let's now create a certificate with different properties using a stronger key size (/K 2048) and a longer validity date (/V 1000 = 1000 days). &lt;BR&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_20.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_20.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_9.png" width=462 height=35 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_9.png"&gt;&lt;/A&gt; &lt;BR&gt;If you look at the certificate properties you can see the differences: &lt;BR&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_22.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_22.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_10.png" width=244 height=132 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_10.png"&gt;&lt;/A&gt; &lt;/LI&gt;
&lt;LI&gt;As a last step lets also export the certificate we are creating. This can be useful if you want to avoid the security warnings also on other machines. The only thing you have to do is to import the exported certificate into your other machines "Current User"-"Trusted Root Certification Authorities" store. You do this by simply double-clicking the PFX file you get after this step. &lt;BR&gt;&lt;A href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_24.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_24.png"&gt;&lt;IMG style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=image border=0 alt=image src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_11.png" width=467 height=85 mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/SettingupSSLmadeeasy_EBF7/image_thumb_11.png"&gt;&lt;/A&gt; &lt;/LI&gt;&lt;/OL&gt;
&lt;H2&gt;Summary&lt;/H2&gt;
&lt;P&gt;With &lt;A href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip" target=_blank mce_href="http://blogs.iis.net/blogs/thomad/SelfSSL7.zip"&gt;SelfSSL7.exe&lt;/A&gt; it becomes extremely simple to set up a SSL site. There are several command-line options that allow you to customize the SSL experience. However, due to the smart defaults you are able to run SELFSSL7.EXE without any parameters and get a fully functioning SSL site. &lt;/P&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3788046" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7LkmQrYPycusqy7X9gIxz7StwEM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7LkmQrYPycusqy7X9gIxz7StwEM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7LkmQrYPycusqy7X9gIxz7StwEM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7LkmQrYPycusqy7X9gIxz7StwEM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=rasKzW_hky0:YjQCB8Fy5kE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=rasKzW_hky0:YjQCB8Fy5kE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=rasKzW_hky0:YjQCB8Fy5kE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=rasKzW_hky0:YjQCB8Fy5kE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=rasKzW_hky0:YjQCB8Fy5kE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=rasKzW_hky0:YjQCB8Fy5kE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/rasKzW_hky0" height="1" width="1"/&gt;</description><category domain="http://blogs.iis.net/thomad/archive/tags/SSL/default.aspx">SSL</category><category domain="http://blogs.iis.net/thomad/archive/tags/certificates/default.aspx">certificates</category><category domain="http://blogs.iis.net/thomad/archive/tags/trust/default.aspx">trust</category><category domain="http://blogs.iis.net/thomad/archive/tags/self-signed/default.aspx">self-signed</category><feedburner:origLink>http://blogs.iis.net/thomad/archive/2010/04/16/setting-up-ssl-made-easy.aspx</feedburner:origLink></item><item><title>Microsoft Web Platform on Amazon EC2</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/KlS7zx1hIvg/microsoft-web-platform-on-amazon-ec2.aspx</link><pubDate>Mon, 12 Apr 2010 21:35:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3781133</guid><dc:creator>thomad</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.iis.net/thomad/rsscomments.aspx?PostID=3781133</wfw:commentRss><wfw:comment>http://blogs.iis.net/thomad/commentapi.aspx?PostID=3781133</wfw:comment><comments>http://blogs.iis.net/thomad/archive/2010/04/12/microsoft-web-platform-on-amazon-ec2.aspx#comments</comments><description>&lt;p&gt;One thing we often hear from Web developers, especially those who offer Web site design and consulting services, is the need to get a Web site up quickly, which runs fast and gives them total control of the server for maximum flexibility and scalability. Today's post is about the &lt;a href="http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=209" mce_href="http://developer.amazonwebservices.com/connect/kbcategory.jspa?categoryID=209" target="_blank"&gt;four Microsoft Web Platform Images (AMIs)&lt;/a&gt; we offer on the &lt;a href="http://aws.amazon.com/ec2" mce_href="http://aws.amazon.com/ec2" target="_blank"&gt;Amazon EC2&lt;/a&gt; platform. These four images allow you to start a blog, stream media or run a web application within minutes - live on the Internet!&lt;/p&gt;  &lt;h3&gt;Amazon EC2&lt;/h3&gt;  &lt;p&gt;Amazon's EC2 has taken an alternative approach to Web hosting.&amp;nbsp; As a Web developer you've probably heard of "cloud computing". It is an alternative take on Web hosting that puts you in control of the servers you spin up and you only pay for what you use.&amp;nbsp; If you've ever bought a book or something else from Amazon, you can use that same account to buy a server and try it out for a few hours, total price: a few bucks, no long running contract or monthly fees. &lt;/p&gt;  &lt;h3&gt;Microsoft Web Platform&lt;/h3&gt;  &lt;p&gt;The Microsoft Web Platform includes the Web server, frameworks, database and tools needed to build and run Web sites on Windows.&amp;nbsp; With the release of &lt;a href="http://www.microsoft.com/web/Downloads/platform.aspx" mce_href="http://www.microsoft.com/web/Downloads/platform.aspx" target="_blank"&gt;Web Platform Installer&lt;/a&gt;, it is now easy to get all the components of the Web Platform installed, as well as some of the world's most popular ASP.NET and PHP applications as well as media streaming.&amp;nbsp; &lt;/p&gt;  &lt;h3&gt;EC2 meets the Microsoft Web Platform&lt;/h3&gt;  &lt;p&gt;EC2 and the Microsoft Web Platform come together in a really slick way. The four AMIs below give you the latest Microsoft Web Platform stack, including &lt;a href="http://www.microsoft.com/visualstudio" mce_href="http://www.microsoft.com/visualstudio" target="_blank"&gt;Visual Studio 2010&lt;/a&gt; which was just released today. Each image comes with a complete &lt;a href="http://learn.iis.net/page.aspx/818/hosting-the-microsoft-web-platform-on-amazon-ec2/" mce_href="http://learn.iis.net/page.aspx/818/hosting-the-microsoft-web-platform-on-amazon-ec2/" target="_blank"&gt;walkthrough&lt;/a&gt;. &lt;/p&gt;  &lt;h3&gt;Full Development Server Image&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_10.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_10.png"&gt;&lt;img src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_thumb_4.png" style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="image" alt="image" mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_thumb_4.png" align="left" border="0" height="33" width="242"&gt;&lt;/a&gt; The "Full Development Server Image" features the latest development stack for the Microsoft Web Platform and since yesterday it includes &lt;a href="http://www.microsoft.com/visualstudio" mce_href="http://www.microsoft.com/visualstudio" target="_blank"&gt;Visual Studio 2010&lt;/a&gt;. It is set up to allow you the publishing of your web application from your local development machine directly to your EC2 instance of this image in the cloud. The image runs Windows Server 2008. It includes the following Microsoft Web Platform features and products: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.iis.net" mce_href="http://www.iis.net" target="_blank"&gt;Internet Information Services 7.0&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.asp.net" mce_href="http://www.asp.net" target="_blank"&gt;ASP.NET 3.5 and 4.0&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.asp.net/mvc" mce_href="http://www.asp.net/mvc" target="_blank"&gt;ASP.NET MVC Framework 2.0&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.php.net" mce_href="http://www.php.net" target="_blank"&gt;PHP 5.2.13&lt;/a&gt; plus the &lt;a href="http://www.iis.net/download/WinCacheForPhp" mce_href="http://www.iis.net/download/WinCacheForPhp" target="_blank"&gt;Windows Cache Extension for PHP&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://go.microsoft.com/?linkid=9726159" mce_href="http://go.microsoft.com/?linkid=9726159" target="_blank"&gt;Visual Web Developer 2010 Express&lt;/a&gt;&amp;nbsp;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.microsoft.com/express/database/" mce_href="http://www.microsoft.com/express/database/" target="_blank"&gt;SQL Server Express 2008 with SP1&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.iis.net/download/urlrewrite" mce_href="http://www.iis.net/download/urlrewrite" target="_blank"&gt;Microsoft Url Rewrite Module&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.iis.net/download/DatabaseManager" mce_href="http://www.iis.net/download/DatabaseManager" target="_blank"&gt;IIS Database Manager&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.iis.net/download/SEOToolkit" mce_href="http://www.iis.net/download/SEOToolkit" target="_blank"&gt;IIS Search Engine Optimization Toolkit&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Here is a &lt;a href="http://learn.iis.net/page.aspx/823/amazon-ec2-microsoft-web-platform-images---full-web-server-development-stack/" mce_href="http://learn.iis.net/page.aspx/823/amazon-ec2-microsoft-web-platform-images---full-web-server-development-stack/" target="_blank"&gt;link&lt;/a&gt; to the walkthrough. It shows you how to set up an EC2 account, how to publish an ASP.NET 4.0 web application to your EC2 instance. &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;Media Server Image&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_8.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_8.png"&gt;&lt;img src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_thumb_3.png" style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="image" alt="image" mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_thumb_3.png" align="left" border="0" height="126" width="244"&gt;&lt;/a&gt; &lt;a href="http://www.iis.net/download/SmoothStreaming" mce_href="http://www.iis.net/download/SmoothStreaming" target="_blank"&gt;Smooth Streaming&lt;/a&gt;, an IIS Media Services extension, enables adaptive streaming of media to Silverlight and other clients over HTTP. Smooth Streaming provides a high-quality viewing experience that scales massively on content distribution networks, making true HD 1080p media experiences a reality. &lt;/p&gt;  &lt;p&gt;Smooth Streaming is the productized version of technology first used by Microsoft to deliver on-demand video of the 2008 Summer Olympics for NBCOlympics.com. By dynamically monitoring both local bandwidth and video rendering performance, Smooth Streaming optimizes playback of content by switching video quality in real-time.&lt;/p&gt;  &lt;p&gt;The image comes with media content and is able to stream video as soon as you boot up your EC2 instance. It is very easy to replace the built-in media content with your own video content - all shown in the accompanying &lt;a href="http://learn.iis.net/page.aspx/820/amazon-ec2-microsoft-web-platform-images---media-server/" mce_href="http://learn.iis.net/page.aspx/820/amazon-ec2-microsoft-web-platform-images---media-server/" target="_blank"&gt;walkthrough&lt;/a&gt;. &lt;/p&gt;  &lt;h3&gt;DotNetNuke Image&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_4.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_4.png"&gt;&lt;img src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_thumb_1.png" style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="image" alt="image" mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_thumb_1.png" align="left" border="0" height="92" width="242"&gt;&lt;/a&gt;&lt;a href="http://www.dotnetnuke.com" mce_href="http://www.dotnetnuke.com" target="_blank"&gt;DotNetNuke&lt;/a&gt; is the leading Web Content Management System (CMS) and Application Development Platform for Microsoft .NET. This AMI has DotNetNuke 5.2.2 pre-installed. All you have to do is to finish the last few installation steps, all described in detail in the following &lt;a href="http://learn.iis.net/page.aspx/817/amazon-ec2-microsoft-web-platform---dotnetnuke/" mce_href="http://learn.iis.net/page.aspx/817/amazon-ec2-microsoft-web-platform---dotnetnuke/" target="_blank"&gt;walkthrough&lt;/a&gt;. The image contains Internet Information Services 7.0, Microsoft SQL Server Express 2008 with SP1, and .NET Framework 3.51 SP1 on Windows Server 2008. &lt;/p&gt;  &lt;h3&gt;&amp;nbsp;&lt;/h3&gt;  &lt;h3&gt;Wordpress Image&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_6.png" mce_href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_6.png"&gt;&lt;img src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_thumb_2.png" style="border: 0px none; display: inline; margin-left: 0px; margin-right: 0px;" title="image" alt="image" mce_src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/MicrosoftWebPlatformonAmazonEC2_9E93/image_thumb_2.png" align="left" border="0" height="138" width="136"&gt;&lt;/a&gt; &lt;a href="http://www.wordpress.org" mce_href="http://www.wordpress.org" target="_blank"&gt;WordPress&lt;/a&gt; is one of the most popular blogging platforms available. The Wordpress AMI is pre-configured with Microsoft Internet Information Services 7.0, MySQL Server 5.1 Community Edition, PHP 5.2.13, PHP WinCache 1.0 and Wordpress 2.9.2 - all hosted on Windows Server 2008. The only thing you have to do is to finish the Wordpress installation by entering a few questions (usernames, passsword etc.) and within a few minutes you have a state-of-the-art blogging platform live on the Internet. The &lt;a href="http://learn.iis.net/page.aspx/813/amazon-ec2-microsoft-web-platform-images---wordpress/" mce_href="http://learn.iis.net/page.aspx/813/amazon-ec2-microsoft-web-platform-images---wordpress/" target="_blank"&gt;walkthrough&lt;/a&gt; guides you through all the details.&amp;nbsp; &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;Questions or comments? Send them to &lt;a href="mailto:ec2@microsoft.com" mce_href="mailto:ec2@microsoft.com"&gt;ec2@microsoft.com&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3781133" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eYquRnG7mwpnQ_tw8kaNs8ujTmg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eYquRnG7mwpnQ_tw8kaNs8ujTmg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eYquRnG7mwpnQ_tw8kaNs8ujTmg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eYquRnG7mwpnQ_tw8kaNs8ujTmg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=KlS7zx1hIvg:r9CF0U266uA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=KlS7zx1hIvg:r9CF0U266uA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=KlS7zx1hIvg:r9CF0U266uA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=KlS7zx1hIvg:r9CF0U266uA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=KlS7zx1hIvg:r9CF0U266uA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=KlS7zx1hIvg:r9CF0U266uA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/KlS7zx1hIvg" height="1" width="1"/&gt;</description><category domain="http://blogs.iis.net/thomad/archive/tags/Wordpress/default.aspx">Wordpress</category><category domain="http://blogs.iis.net/thomad/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://blogs.iis.net/thomad/archive/tags/EC2/default.aspx">EC2</category><category domain="http://blogs.iis.net/thomad/archive/tags/Smooth+Streaming/default.aspx">Smooth Streaming</category><category domain="http://blogs.iis.net/thomad/archive/tags/DotNetNuke/default.aspx">DotNetNuke</category><category domain="http://blogs.iis.net/thomad/archive/tags/Amazon+EC2/default.aspx">Amazon EC2</category><category domain="http://blogs.iis.net/thomad/archive/tags/Microsoft+Web+Platform/default.aspx">Microsoft Web Platform</category><feedburner:origLink>http://blogs.iis.net/thomad/archive/2010/04/12/microsoft-web-platform-on-amazon-ec2.aspx</feedburner:origLink></item><item><title>A New Site - Quick!</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/jh3yzRwSM4Q/a-new-site-quick.aspx</link><pubDate>Sat, 10 Apr 2010 07:08:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3777756</guid><dc:creator>thomad</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.iis.net/thomad/rsscomments.aspx?PostID=3777756</wfw:commentRss><wfw:comment>http://blogs.iis.net/thomad/commentapi.aspx?PostID=3777756</wfw:comment><comments>http://blogs.iis.net/thomad/archive/2010/04/10/a-new-site-quick.aspx#comments</comments><description>&lt;P&gt;For testing purposes I sometimes need a new IIS site, often times running in its own AppPool. And I usually need it fast and without much programming. I hate ports and so I normally put my site name in the hosts file. Locally this works great! &lt;/P&gt;
&lt;P&gt;Because I'm an old kind-a guy I still use batch files with some pixie dust from appcmd. I thought somebody might find this script useful, too:&lt;/P&gt;
&lt;DIV id=codeSnippetWrapper&gt;&lt;PRE class=csharpcode&gt;@ECHO OFF&lt;BR&gt;REM ===============================================================================================&lt;BR&gt;REM CREATE A NEW SITE IN ITS OWN APPPOOL. &lt;BR&gt;REM ARGUMENTS: SITENAME &lt;BR&gt;REM&lt;BR&gt;REM STEPS:&lt;BR&gt;REM 1) SETUP AND ARGUMENTS CHECKS&lt;BR&gt;REM 2) CREATE APPPOOL (SAME NAME AS SITE)&lt;BR&gt;REM 3) CREATE DIRECTORY c:\inetpub\&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;sitename&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;REM 4) CREATE DEFAULT.ASPX FILE IN c:\inetpub\&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;sitename&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;REM 5) CREATE SITE WITH PHYSICALPATH c:\inetpub\&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;sitename&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;REM 6) ASSIGN SITE ROOT APP TO APPLICATIONPOOL &lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;sitename&lt;/SPAN&gt;&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;REM 7) ADD SITENAME TO HOSTS FILE RESOLVING TO 127.0.0.1&lt;BR&gt;REM 8) LAUNCH IE WITH SITE &lt;BR&gt;REM ===============================================================================================&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;BR&gt;REM GOTO USAGE IF NO COMMAND-LINE ARGUMENTS&lt;BR&gt;if "%1" == "" GOTO USAGE&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;REM CREATE SOME LOCAL VARIABLES&lt;BR&gt;SETLOCAL&lt;BR&gt;SET NEWDIR="%SYSTEMDRIVE%\inetpub\%1"&lt;BR&gt;SET APPCMD=%WINDIR%\system32\inetsrv\appcmd.exe&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;&lt;BR&gt;@ECHO CREATE THE APPPOOL&lt;BR&gt;%APPCMD% ADD APPPOOL /NAME:"%1"&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;BR&gt;&lt;BR&gt;@ECHO CREATE THE CONTENT DIRECTORY&lt;BR&gt;MD %NEWDIR%&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;BR&gt;&lt;BR&gt;@ECHO CREATE DEFAULT.ASPX FILE IN CONTENT DIRECTORY&lt;BR&gt;ECHO ^&lt;SPAN class=asp&gt;&amp;lt;%&lt;/SPAN&gt;%=DateTime.Now%%^&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt; &lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt; "%NEWDIR%\default.aspx"&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;BR&gt;&lt;BR&gt;@ECHO CREATE NEW SITE &lt;BR&gt;%APPCMD% ADD SITE /NAME:"%1" /BINDINGS:"http://%1:80" /PHYSICALPATH:"%NEWDIR%"&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;BR&gt;&lt;BR&gt;@ECHO ASSIGN TO APPLICATION POOL&lt;BR&gt;%APPCMD% SET APP "%1/" /APPLICATIONPOOL:"%1"&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;BR&gt;&lt;BR&gt;@ECHO ADD SITENAME TO HOSTS FILE&lt;BR&gt;ECHO 127.0.0.1  %1 &lt;SPAN class=kwrd&gt;&amp;gt;&amp;gt;&lt;/SPAN&gt; %WINDIR%\system32\drivers\etc\hosts&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;&lt;BR&gt;&lt;BR&gt;@ECHO LAUNCH INTERNET EXPLORER WITH THE NEW SITE&lt;BR&gt;START IEXPLORE &lt;A href="http://%1/" mce_href="http://%1/"&gt;http://%1/&lt;/A&gt;&lt;/PRE&gt;&lt;PRE class=csharpcode&gt;REM USAGE MESSAGE IF NO COMMAND-LINE ARGUMENT WAS GIVEN&lt;BR&gt;&lt;BR&gt;GOTO EXIT&lt;BR&gt;:USAGE&lt;BR&gt;@ECHO USAGE: %0 ^&lt;SPAN class=kwrd&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=html&gt;name&lt;/SPAN&gt; &lt;SPAN class=attr&gt;of&lt;/SPAN&gt; &lt;SPAN class=attr&gt;new&lt;/SPAN&gt; &lt;SPAN class=attr&gt;site&lt;/SPAN&gt;^&lt;SPAN class=kwrd&gt;&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;@ECHO     Example: "%0 MyNewSite"&lt;BR&gt;:EXIT&lt;BR&gt;&lt;/PRE&gt;&lt;BR&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;/DIV&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3777756" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/YV5jAV-I2ssJbqYDFLJc53xXoG8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YV5jAV-I2ssJbqYDFLJc53xXoG8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/YV5jAV-I2ssJbqYDFLJc53xXoG8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/YV5jAV-I2ssJbqYDFLJc53xXoG8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=jh3yzRwSM4Q:8VzbJua3JYw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=jh3yzRwSM4Q:8VzbJua3JYw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=jh3yzRwSM4Q:8VzbJua3JYw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=jh3yzRwSM4Q:8VzbJua3JYw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=jh3yzRwSM4Q:8VzbJua3JYw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=jh3yzRwSM4Q:8VzbJua3JYw:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/jh3yzRwSM4Q" height="1" width="1"/&gt;</description><category domain="http://blogs.iis.net/thomad/archive/tags/appcmd/default.aspx">appcmd</category><category domain="http://blogs.iis.net/thomad/archive/tags/Application+Pools/default.aspx">Application Pools</category><category domain="http://blogs.iis.net/thomad/archive/tags/web+site/default.aspx">web site</category><category domain="http://blogs.iis.net/thomad/archive/tags/batch+programming/default.aspx">batch programming</category><category domain="http://blogs.iis.net/thomad/archive/tags/hosts+file/default.aspx">hosts file</category><feedburner:origLink>http://blogs.iis.net/thomad/archive/2010/04/10/a-new-site-quick.aspx</feedburner:origLink></item><item><title>How to run a CGI program under IIS 7.0 or IIS 7.5</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/z9OcJeAsqq8/how-to-run-a-cgi-program-under-iis-7-0-or-iis-7-5.aspx</link><pubDate>Mon, 05 Apr 2010 06:32:03 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3767617</guid><dc:creator>thomad</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.iis.net/thomad/rsscomments.aspx?PostID=3767617</wfw:commentRss><wfw:comment>http://blogs.iis.net/thomad/commentapi.aspx?PostID=3767617</wfw:comment><comments>http://blogs.iis.net/thomad/archive/2010/04/04/how-to-run-a-cgi-program-under-iis-7-0-or-iis-7-5.aspx#comments</comments><description>&lt;p&gt;Looking around I didn't find a good documentation on how to get good old CGI's running on IIS 7 or 7.5. Here is a quick walkthrough: &lt;/p&gt;  &lt;p&gt;1. Let's write a quick CGI:    &lt;br /&gt;Take the following code and save it as simplecgi.cs in the directory c:\inetpub\wwwroot\cgi&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre id="codeSnippet" class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; SimpleCGI&lt;br /&gt;{&lt;br /&gt;    &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;    {&lt;br /&gt;        Console.WriteLine(&lt;span class="str"&gt;&amp;quot;\r\n\r\n&amp;quot;&lt;/span&gt;);&lt;br /&gt;        Console.WriteLine(&lt;span class="str"&gt;&amp;quot;&amp;lt;h1&amp;gt;Environment Variables&amp;lt;/h1&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (DictionaryEntry var &lt;span class="kwrd"&gt;in&lt;/span&gt; Environment.GetEnvironmentVariables())&lt;br /&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;&amp;lt;hr&amp;gt;&amp;lt;b&amp;gt;{0}&amp;lt;/b&amp;gt;: {1}&amp;quot;&lt;/span&gt;, var.Key, var.Value);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;2. Change into the C:\inetpub\wwwroot\cgi directory and compile the source by using the following command-line:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre id="codeSnippet" class="csharpcode"&gt;&lt;br /&gt;%windir%\Microsoft.NET\Framework\v2.0.50727\csc.exe SimpleCGI.cs&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;You will have simplecgi.exe in the cgi directory. You can execute it on the command-line to see its output. &lt;/p&gt;

&lt;p&gt;3. For security reasons every CGI has to be registered in the ISAPI/CGI Restriction list. To do that you have to open INETMGR, click the machine node (name of your machine) and find the ISAPI/CGI Restriction List menu icon. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/HowtorunaCGIprogramunderIIS7.0orIIS7.5_1487A/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/HowtorunaCGIprogramunderIIS7.0orIIS7.5_1487A/image_thumb.png" width="105" height="115" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Select the item and add the following entries in the dialog box:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/HowtorunaCGIprogramunderIIS7.0orIIS7.5_1487A/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/HowtorunaCGIprogramunderIIS7.0orIIS7.5_1487A/image_thumb_1.png" width="315" height="182" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Alternatively you can use the command-line:&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre id="codeSnippet" class="csharpcode"&gt;&lt;br /&gt;%windir%\system32\inetsrv\appcmd set config -section:isapiCgiRestriction &lt;br /&gt;/+[path='c:\inetpub\wwwroot\cgi\simplecgi.exe',allowed='&lt;span class="kwrd"&gt;true&lt;/span&gt;',description='SimpleCGI']&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;4. The next step is to create a virtual directory that allows CGIs to execute. Right click the &amp;quot;Default Web Site&amp;quot; in INETMGR and select &amp;quot;Add Virtual Directory&amp;quot;. Add the following entries:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/HowtorunaCGIprogramunderIIS7.0orIIS7.5_1487A/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/HowtorunaCGIprogramunderIIS7.0orIIS7.5_1487A/image_thumb_2.png" width="244" height="199" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Here is the command-line which does the same: 
  &lt;br /&gt;&lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre id="codeSnippet" class="csharpcode"&gt;appcmd add vdir /app.name:&lt;span class="str"&gt;&amp;quot;Default Web Site/&amp;quot;&lt;/span&gt; /path:/cgi &lt;br /&gt;/physicalPath:&lt;span class="str"&gt;&amp;quot;c:\inetpub\wwwroot\cgi&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt; 5. One last step: we still don't allow &amp;quot;Execute&amp;quot; access in this directory. For this you have to go to the Handler Mappings menu of the CGI virtual directory (make sure you select the CGI virtual directory on the left hand side!). &lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/HowtorunaCGIprogramunderIIS7.0orIIS7.5_1487A/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/HowtorunaCGIprogramunderIIS7.0orIIS7.5_1487A/image_thumb_3.png" width="93" height="98" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Go to the &amp;quot;Edit Feature Permissions&amp;quot; link in the Actions Menu on the right hand side, open it and check &amp;quot;Execute&amp;quot; and click &amp;quot;OK&amp;quot;. &lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/HowtorunaCGIprogramunderIIS7.0orIIS7.5_1487A/image_10.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/HowtorunaCGIprogramunderIIS7.0orIIS7.5_1487A/image_thumb_4.png" width="244" height="157" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;via command-line: &lt;/p&gt;

&lt;div id="codeSnippetWrapper"&gt;
  &lt;pre id="codeSnippet" class="csharpcode"&gt;appcmd set config &lt;span class="str"&gt;&amp;quot;Default Web Site/cgi&amp;quot;&lt;/span&gt; /section:handlers &lt;br /&gt;-accessPolicy:&lt;span class="str"&gt;&amp;quot;Read,Script,Execute&amp;quot;&lt;/span&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;Now you are ready to go. Type &amp;quot;http://localhost/cgi/simplecgi.exe and you should see the following output: &lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/HowtorunaCGIprogramunderIIS7.0orIIS7.5_1487A/image_12.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://blogs.iis.net/blogs/thomad/WindowsLiveWriter/HowtorunaCGIprogramunderIIS7.0orIIS7.5_1487A/image_thumb_5.png" width="366" height="203" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Wasn't to bad after all? Was it? &lt;/p&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3767617" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bfKGcOBWY1wCU-KwMmK4fPeIyls/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bfKGcOBWY1wCU-KwMmK4fPeIyls/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bfKGcOBWY1wCU-KwMmK4fPeIyls/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bfKGcOBWY1wCU-KwMmK4fPeIyls/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=z9OcJeAsqq8:VeNmFd9xvrU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=z9OcJeAsqq8:VeNmFd9xvrU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=z9OcJeAsqq8:VeNmFd9xvrU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=z9OcJeAsqq8:VeNmFd9xvrU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=z9OcJeAsqq8:VeNmFd9xvrU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=z9OcJeAsqq8:VeNmFd9xvrU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/z9OcJeAsqq8" height="1" width="1"/&gt;</description><category domain="http://blogs.iis.net/thomad/archive/tags/ISAPIRestrictions/default.aspx">ISAPIRestrictions</category><category domain="http://blogs.iis.net/thomad/archive/tags/Handler+Mappings/default.aspx">Handler Mappings</category><category domain="http://blogs.iis.net/thomad/archive/tags/CGI/default.aspx">CGI</category><feedburner:origLink>http://blogs.iis.net/thomad/archive/2010/04/04/how-to-run-a-cgi-program-under-iis-7-0-or-iis-7-5.aspx</feedburner:origLink></item><item><title>Measuring incoming and outgoing bandwidth per Application Pool</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/Hdq6R7t8SzU/measuring-incoming-and-outgoing-bandwidth-per-application-pool.aspx</link><pubDate>Wed, 31 Mar 2010 18:00:21 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3761143</guid><dc:creator>thomad</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.iis.net/thomad/rsscomments.aspx?PostID=3761143</wfw:commentRss><wfw:comment>http://blogs.iis.net/thomad/commentapi.aspx?PostID=3761143</wfw:comment><comments>http://blogs.iis.net/thomad/archive/2010/03/31/measuring-incoming-and-outgoing-bandwidth-per-application-pool.aspx#comments</comments><description>&lt;p&gt;This blog post is about working in a big company where the left hand often times doesn't know what the right hand does. &lt;/p&gt;  &lt;p&gt;These days we are talking quite a bit about how to best measure resource consumption (disk, memory, CPU, requests per second, incoming, outgoing bandwidth) of individual Application Pools. As part of this exercise we looked at IIS and HTTP.SYS performance counters and found a pretty embarrassing issue when it comes to measuring bandwidth. &lt;/p&gt;  &lt;p&gt;You might know that HTTP.SYS does a lot of content caching for IIS. The benefit is that some requests can be directly returned from kernel mode without ever having to go to user mode where IIS lives. This can speed up response time quite drastically. IIS has a per Web-Site performance counter that measures bandwidth (&amp;quot;Web Service&amp;quot;, &amp;quot;Bytes Received/sec&amp;quot; and Web Service&amp;quot;, &amp;quot;Bytes Sent/sec&amp;quot;). The problem is that this only measures the bandwidth for requests that make it to user mode. All requests that get cached by HTTP.SYS in kernel-mode will not be measured. &lt;/p&gt;  &lt;p&gt;The good thing is that HTTP.SYS has the same performance counters (&amp;quot;HTTP Service Url Groups&amp;quot;, &amp;quot;BytesReceivedRate&amp;quot; and &amp;quot;HTTP Service UrlGroups&amp;quot;, &amp;quot;BytesSentRate&amp;quot;). Great! &lt;/p&gt;  &lt;p&gt;Here comes the issue though: the counters are per-Url Group and not per Web-Site or per Application Pool and there is no obvious way to figure out which Web Site or Application Pool is in which Url Group (what Url Groups are is explained &lt;a title="Definition: Url Groups" href="http://msdn.microsoft.com/en-us/library/aa364667(v=VS.85).aspx" target="_blank"&gt;here&lt;/a&gt;). HTTP.SYS provides no APIs to get to this information. The only way to make the connection between a Url Group and an Application Pool is to parse the output of the &amp;quot;NETSH.EXE HTTP SHOW SERVICESTATE&amp;quot; command which shows a snapshot of the HTTP.SYS service configuration. By parsing out the UrlGroups and the associated Application Pool you can now write a program that measures the incoming and outgoing bandwidth on a per Application Pool basis. &lt;/p&gt;  &lt;p&gt;Last night I wrote a PowerShell script that does exactly that. Here roughly the steps the script follows: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Execute the netsh command and store the output in variable $file_lines &lt;/li&gt;    &lt;li&gt;Loop through each line and find the string &amp;quot;URL group ID: &amp;quot; &lt;/li&gt;    &lt;li&gt;If the string is found we look for the associated AppPool which is shown after the string &amp;quot;Request queue name: &amp;quot; &lt;/li&gt;    &lt;li&gt;Ignore non-IIS Url Groups (&amp;quot;Request queue is unnamed.&amp;quot;) &lt;/li&gt;    &lt;li&gt;Add URL Group/AppPool combo to a hash table which has the Application Pool as a key and an array of Url Groups as its value. &lt;/li&gt;    &lt;li&gt;Create a perf counter for BytesSentRate, BytesReceivedRate and AllRequests. &lt;/li&gt;    &lt;li&gt;Loop through the Url Groups for each Application Pool and add the values together to get the total value. &lt;/li&gt;    &lt;li&gt;Write values to console. &lt;/li&gt; &lt;/ol&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;pre class="csharpcode"&gt;$URLGROUP_STRING = &lt;span class="str"&gt;&amp;quot;URL group ID: &amp;quot;&lt;/span&gt;;&lt;br /&gt;$APPPOOL_NAME_STRING = &lt;span class="str"&gt;&amp;quot;Request queue name: &amp;quot;&lt;/span&gt;;&lt;br /&gt;$NON_IIS_URLGROUP = &lt;span class="str"&gt;&amp;quot;Request queue is unnamed.&amp;quot;&lt;/span&gt;;&lt;br /&gt;$UrlPoolHashTable = @{};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$file_lines = &amp;amp;&lt;span class="str"&gt;&amp;quot;c:\windows\system32\netsh.exe&amp;quot;&lt;/span&gt; http show servicestate&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;for&lt;/span&gt;($i = 0; $i &lt;span class="preproc"&gt;-lt&lt;/span&gt; $file_lines.Length; $i++)&lt;br /&gt;{&lt;br /&gt;    $res = $file_lines[$i].IndexOf(&lt;span class="str"&gt;&amp;quot;$URLGROUP_STRING&amp;quot;&lt;/span&gt;);    &lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; ($res &lt;span class="preproc"&gt;-ge&lt;/span&gt; 0)&lt;br /&gt;    {&lt;br /&gt;        $urlgroup = $file_lines[$i].SubString($res + $URLGROUP_STRING.Length);        &lt;br /&gt;        &lt;span class="kwrd"&gt;while&lt;/span&gt; (++$i-lt $file_lines.Length)&lt;br /&gt;        {        &lt;br /&gt;            $res = $file_lines[$i].IndexOf(&lt;span class="str"&gt;&amp;quot;$APPPOOL_NAME_STRING&amp;quot;&lt;/span&gt;);&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; ($res &lt;span class="preproc"&gt;-ge&lt;/span&gt; 0)&lt;br /&gt;            {&lt;br /&gt;                $appPool = $file_lines[$i].`&lt;br /&gt;                                SubString($res + $APPPOOL_NAME_STRING.Length);&lt;br /&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; ($false &lt;span class="preproc"&gt;-eq&lt;/span&gt; $appPool.Contains(&lt;span class="str"&gt;&amp;quot;$NON_IIS_URLGROUP&amp;quot;&lt;/span&gt;))&lt;br /&gt;                {&lt;br /&gt;                    &lt;span class="kwrd"&gt;if&lt;/span&gt; ($UrlPoolHashTable.ContainsKey($appPool))&lt;br /&gt;                    {&lt;br /&gt;                        $UrlPoolHashTable[$appPool] += &lt;span class="str"&gt;&amp;quot;$urlgroup&amp;quot;&lt;/span&gt;;                    &lt;br /&gt;                    }&lt;br /&gt;                    &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;                    {&lt;br /&gt;                        $UrlPoolHashTable[$appPool] = , &lt;span class="str"&gt;&amp;quot;$urlgroup&amp;quot;&lt;/span&gt;;&lt;br /&gt;                    }                    &lt;br /&gt;                }&lt;br /&gt;                &lt;span class="kwrd"&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }    &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; ($appPoolkey &lt;span class="kwrd"&gt;in&lt;/span&gt; $UrlPoolHashTable.Keys)&lt;br /&gt;{&lt;br /&gt;    $bwOut = new-object System.Diagnostics.PerformanceCounter(&lt;br /&gt;                            &lt;span class="str"&gt;&amp;quot;Http Service Url Groups&amp;quot;&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;BytesSentRate&amp;quot;&lt;/span&gt;);&lt;br /&gt;    $bwIn  = new-object System.Diagnostics.PerformanceCounter(&lt;br /&gt;                            &lt;span class="str"&gt;&amp;quot;Http Service Url Groups&amp;quot;&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;BytesReceivedRate&amp;quot;&lt;/span&gt;);&lt;br /&gt;    $req  = new-object System.Diagnostics.PerformanceCounter(&lt;br /&gt;                            &lt;span class="str"&gt;&amp;quot;Http Service Url Groups&amp;quot;&lt;/span&gt;,&lt;span class="str"&gt;&amp;quot;AllRequests&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    $inTotal = 0;&lt;br /&gt;    $outTotal = 0;&lt;br /&gt;    $reqTotal = 0;&lt;br /&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; ($urlgroup &lt;span class="kwrd"&gt;in&lt;/span&gt; $UrlPoolHashTable[$appPoolkey])&lt;br /&gt;    {&lt;br /&gt;        $bwOut.instanceName = $urlgroup;&lt;br /&gt;        $bwIn.instanceName = $urlgroup;&lt;br /&gt;        $req.instanceName = $urlgroup;&lt;br /&gt;        $outTotal += $bwOut.RawValue;&lt;br /&gt;        $inTotal += $bwIn.RawValue;&lt;br /&gt;        $reqTotal += $req.RawValue;        &lt;br /&gt;    }&lt;br /&gt;    &lt;span class="str"&gt;&amp;quot;Application Pool: $appPoolKey&amp;quot;&lt;/span&gt;;&lt;br /&gt;    &lt;span class="str"&gt;&amp;quot;             Bandwidth out: &amp;quot;&lt;/span&gt; + $outTotal + &lt;span class="str"&gt;&amp;quot; bytes&amp;quot;&lt;/span&gt;;&lt;br /&gt;    &lt;span class="str"&gt;&amp;quot;             Bandwidth in:  &amp;quot;&lt;/span&gt; + $inTotal + &lt;span class="str"&gt;&amp;quot; bytes&amp;quot;&lt;/span&gt;;&lt;br /&gt;    &lt;span class="str"&gt;&amp;quot;             Request Total: &amp;quot;&lt;/span&gt; + $reqTotal;&lt;br /&gt;        &lt;br /&gt;    &lt;br /&gt;}    &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;P.S: The counter gets reset when the Url Group is removed, e.g. when the W3SVC service is stopped. Also: this probably only works with the english version of Windows. I'm assuming that localized Windows versions will have different strings to search for. &lt;/p&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3761143" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5JMelCUDlixi1kyJNkU-tqITehg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5JMelCUDlixi1kyJNkU-tqITehg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5JMelCUDlixi1kyJNkU-tqITehg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5JMelCUDlixi1kyJNkU-tqITehg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Hdq6R7t8SzU:ywaX2w9hvw8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Hdq6R7t8SzU:ywaX2w9hvw8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=Hdq6R7t8SzU:ywaX2w9hvw8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Hdq6R7t8SzU:ywaX2w9hvw8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=Hdq6R7t8SzU:ywaX2w9hvw8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=Hdq6R7t8SzU:ywaX2w9hvw8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/Hdq6R7t8SzU" height="1" width="1"/&gt;</description><feedburner:origLink>http://blogs.iis.net/thomad/archive/2010/03/31/measuring-incoming-and-outgoing-bandwidth-per-application-pool.aspx</feedburner:origLink></item><item><title>Put the brakes on your Application Pools: CPU Rate Limits in Windows Server 2008</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/wOR0hMhFqAo/put-the-brakes-on-your-application-pools-cpu-rate-limits-in-windows-7.aspx</link><pubDate>Tue, 16 Feb 2010 00:52:59 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3681245</guid><dc:creator>thomad</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.iis.net/thomad/rsscomments.aspx?PostID=3681245</wfw:commentRss><wfw:comment>http://blogs.iis.net/thomad/commentapi.aspx?PostID=3681245</wfw:comment><comments>http://blogs.iis.net/thomad/archive/2010/02/15/put-the-brakes-on-your-application-pools-cpu-rate-limits-in-windows-7.aspx#comments</comments><description>&lt;p&gt;Are you using IIS Application Pools to host your customer's web sites? The more sites you host on a single machine the more likely it is one of these sites misbehaves and monopolizes system resources like the CPU. It's so easy for a programmer to do - forget to call the MoveNext() function in a database script and you spin the CPU at 100% until the underlying script engine times out. &lt;/p&gt;  &lt;p&gt;This can mean of course that other sites on your machine might not get enough CPU cycles and starve. All this because somebody doesn't play nice and eats all the pie. CPU rate limits on Windows Server 2008 and Windows Server 2008 R2 allow you to cut the pie more equally. &lt;/p&gt;  &lt;p&gt;CPU rate limits can limit a particular user account to consume only a configurable percentage of each physical CPU, e.g. 10%. This becomes very handy if the &lt;a href="http://learn.iis.net/page.aspx/624/application-pool-identities/" target="_blank"&gt;new IIS Application Pool Identities feature&lt;/a&gt; in IIS 7.5 (Windows Server 2008 R2) or Windows Sever 2008 SP2 is used. &lt;/p&gt;  &lt;p&gt;The following &lt;a title="CPU Rate Limit Feature" href="http://technet.microsoft.com/en-us/library/ff384148(WS.10).aspx" target="_blank"&gt;technet article which describes the feature in detail&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;I wrote a PowerShell script iif you want to try it yourself:&lt;/p&gt;  &lt;div id="codeSnippetWrapper"&gt;   &lt;div id="codeSnippet" class="csharpcode"&gt;&lt;!--CRLF--&gt;     &lt;div id="codeSnippetWrapper"&gt;       &lt;div id="codeSnippet" class="csharpcode"&gt;         &lt;div id="codeSnippetWrapper"&gt;           &lt;pre id="codeSnippet" class="csharpcode"&gt;&lt;span class="kwrd"&gt;param&lt;/span&gt; ( [Parameter(Mandatory=$true)][string] $account, [Parameter(Mandatory=$true)][int] $rate) &lt;br /&gt;$objAccount = New-Object System.Security.Principal.NTAccount($account) &lt;br /&gt;$strSID = $objAccount.Translate([System.Security.Principal.SecurityIdentifier]).Value &lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; ($strSID &lt;span class="preproc"&gt;-eq&lt;/span&gt; $null) &lt;br /&gt;{ &lt;br /&gt; &lt;span class="str"&gt;&amp;quot;Account $account cannot be translated into a SID&amp;quot;&lt;/span&gt;; &lt;br /&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt;; &lt;br /&gt;} &lt;br /&gt;&lt;span class="str"&gt;&amp;quot;SID for $account : `t$strSID&amp;quot;&lt;/span&gt;; &lt;br /&gt;$quota_hive = &lt;span class="str"&gt;&amp;quot;HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Quota System\$strSID&amp;quot;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;$out = New-Item -path &lt;span class="str"&gt;&amp;quot;$quota_hive&amp;quot;&lt;/span&gt; -force &lt;br /&gt;$out = New-ItemProperty -path &lt;span class="str"&gt;&amp;quot;$quota_hive&amp;quot;&lt;/span&gt; -name CpuRateLimit -value $rate &lt;br /&gt;&lt;span class="str"&gt;&amp;quot;CPU Rate for account $account set to $rate %&amp;quot;&lt;/span&gt;&lt;/pre&gt;

          &lt;br /&gt;&lt;/div&gt;

        &lt;pre class="alteven"&gt;&lt;span class="str"&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
    &lt;/div&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;And here is the same as &lt;a href="http://blogs.iis.net/blogs/thomad/set-AccountQuota.zip" target="_blank"&gt;command-line tool&lt;/a&gt; if you don't want to use a PowerShell script. &lt;/p&gt;

&lt;p&gt;Now here comes the drawback. The CPU Rate Limit feature has a bug. The kernel is holding on to a handle to the quota object and never lets go of it. This means once you set the CPU rate limit to a particular percentage you can't change this percentage without rebooting the machine. We are working on fixing it - not sure when we'll have a fix though.&amp;#160; &lt;/p&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3681245" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/yRI1t7u8n1IoE9cdepDE_L5WGX4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yRI1t7u8n1IoE9cdepDE_L5WGX4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/yRI1t7u8n1IoE9cdepDE_L5WGX4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/yRI1t7u8n1IoE9cdepDE_L5WGX4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=wOR0hMhFqAo:1XVcGlZ2Pnk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=wOR0hMhFqAo:1XVcGlZ2Pnk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=wOR0hMhFqAo:1XVcGlZ2Pnk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=wOR0hMhFqAo:1XVcGlZ2Pnk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=wOR0hMhFqAo:1XVcGlZ2Pnk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=wOR0hMhFqAo:1XVcGlZ2Pnk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/wOR0hMhFqAo" height="1" width="1"/&gt;</description><feedburner:origLink>http://blogs.iis.net/thomad/archive/2010/02/15/put-the-brakes-on-your-application-pools-cpu-rate-limits-in-windows-7.aspx</feedburner:origLink></item><item><title>IIS7 and Failover Clustering</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/AQ4zn146iDQ/iis7-and-failover-clustering.aspx</link><pubDate>Tue, 27 Oct 2009 07:00:00 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3478770</guid><dc:creator>thomad</dc:creator><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.iis.net/thomad/rsscomments.aspx?PostID=3478770</wfw:commentRss><wfw:comment>http://blogs.iis.net/thomad/commentapi.aspx?PostID=3478770</wfw:comment><comments>http://blogs.iis.net/thomad/archive/2009/10/27/iis7-and-failover-clustering.aspx#comments</comments><description>&lt;P&gt;We recently published an &lt;A href="http://support.microsoft.com/kb/970759/" target=_blank mce_href="http://support.microsoft.com/kb/970759/"&gt;article&lt;/A&gt; on how to enable failover clustering for IIS7 and Microsoft Cluster Service (MSCS). MSCS provides failover and increased availability of applications by failing over to a second machine that is on stand-by or by just taking the sick machine out of the network so that no requests are routed to it anymore. &lt;/P&gt;
&lt;P&gt;There is a fundamental problem with configuring failover clustering for IIS however: IIS in itself is not an application; IIS is an application&amp;nbsp;platform and it's hard to come up with a clear yay or nay when to fail over. We don't know enough to decide if an application is terminally sick and can't recover. Is it when a web application returns 500 errors, when the application is overloaded and TCP connections can't be established anymore, when its Application Pool crashes repeatedly? What if more than one application is hosted on the IIS machine?&amp;nbsp;Should IIS only fail over when W3SVC is terminated? Should IIS fail over if one of the web applications is dead, when 50% of the apps are dead? 90%?&amp;nbsp; &lt;/P&gt;
&lt;P&gt;There is no good way to make these decisions without involving the people managing the IIS machine and the web application developers that run code on the IIS box. And that's why we decided to publish sample code that somebody can take and adjust for their specific needs. &lt;/P&gt;
&lt;P&gt;The sample code in the &lt;A href="http://support.microsoft.com/kb/970759/" target=_blank mce_href="http://support.microsoft.com/kb/970759/"&gt;article&lt;/A&gt; is a script that can be configured as a &lt;A href="http://msdn.microsoft.com/en-us/library/aa373089(VS.85).aspx" target=_blank mce_href="http://msdn.microsoft.com/en-us/library/aa373089(VS.85).aspx"&gt;Generic Script Resource&lt;/A&gt; in the MSCS service. The script monitors the run-time status of the IIS7 "Default Web Site" and IIS7 "DefaultAppPool" and will trigger a fail over if one of them is stopped. It is trivial to change the Site or Application Pool name in the script and it should be easy for a developer familiar with VBScript to add some custom functionality to this script. &lt;/P&gt;
&lt;P&gt;Happy fail over!&lt;/P&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3478770" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/27Fpif3He424WQFKbb96HRJQQos/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/27Fpif3He424WQFKbb96HRJQQos/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/27Fpif3He424WQFKbb96HRJQQos/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/27Fpif3He424WQFKbb96HRJQQos/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=AQ4zn146iDQ:0NLp9a2zJDg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=AQ4zn146iDQ:0NLp9a2zJDg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=AQ4zn146iDQ:0NLp9a2zJDg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=AQ4zn146iDQ:0NLp9a2zJDg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=AQ4zn146iDQ:0NLp9a2zJDg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=AQ4zn146iDQ:0NLp9a2zJDg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/AQ4zn146iDQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://blogs.iis.net/thomad/archive/2009/10/27/iis7-and-failover-clustering.aspx</feedburner:origLink></item><item><title>Kerberos Authentication Issues</title><link>http://feedproxy.google.com/~r/JustAnotherIISBlog/~3/6_l56CrHgHg/kerberos-authentication-issues.aspx</link><pubDate>Sat, 24 Oct 2009 05:30:58 GMT</pubDate><guid isPermaLink="false">50bcf3b4-f6fe-4638-adff-0c150e922e99:3474780</guid><dc:creator>thomad</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://blogs.iis.net/thomad/rsscomments.aspx?PostID=3474780</wfw:commentRss><wfw:comment>http://blogs.iis.net/thomad/commentapi.aspx?PostID=3474780</wfw:comment><comments>http://blogs.iis.net/thomad/archive/2009/10/23/kerberos-authentication-issues.aspx#comments</comments><description>&lt;p&gt;We ran into some problems with Kerberos authentication lately and this forced me to unearth the knowledge I once had about Kerberos. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Issue:     &lt;br /&gt;&lt;/strong&gt;Some Microsoft employees ran into &lt;a href="http://en.wikipedia.org/wiki/List_of_HTTP_status_codes" target="_blank"&gt;400 errors&lt;/a&gt; when accessing certain Intranet web pages. A 400 error is pretty much a bad request. Kerberos authentication was the cause for this problem. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The Details:     &lt;br /&gt;&lt;/strong&gt;The web sites in question returned a &amp;quot;400 error - request too long&amp;quot; for content protected with IIS Windows Integrated Authentication. It turns out that people who faced this problem had an &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html" target="_blank"&gt;Authorization header&lt;/a&gt; that was larger than 16kB and that HTTP.SYS (the kernel-mode driver underneath IIS) has a request limit of 16kB, i.e. no request can be larger than 16kB by default. &lt;/p&gt;  &lt;p&gt;The problem and the fix - increasing the maximum header size and the maximum request size of HTTP.SYS - is described in this &lt;a href="http://support.microsoft.com/kb/970875" target="_blank"&gt;KB article&lt;/a&gt;. So why would the Kerberos Authorization get larger than 16kB? Turns out that the Kerberos ticket which is encoded in the Authorization header contains all group memberships of the user who wants to authenticate against the web server. The more groups a user is a member of the larger the Authorization header gets. The magic number of group memberships seems to be around 300. &lt;/p&gt;  &lt;p&gt;So here are a couple of ways to investigate the problem if you think you run into similar issues:&lt;/p&gt;  &lt;p&gt;1) The whoami tool can tell you your group memberships: &lt;/p&gt;  &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;   &lt;pre id="codeSnippet" class="csharpcode"&gt;whoami /groups &lt;br /&gt;&lt;/pre&gt;

  &lt;br /&gt;&lt;/div&gt;

&lt;p&gt;2) Here is a piece of ASP.NET code that tells you how big the authorization header is and the group memberships of the authenticating user (just save the file as kerb_check.aspx in your wwwroot directory and turn Windows Integrated authentication on and anonymous authentication off):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
    &lt;div id="codeSnippetWrapper" class="csharpcode-wrapper"&gt;
      &lt;pre id="codeSnippet" class="csharpcode"&gt;&amp;lt;%@Language =&lt;span class="str"&gt;&amp;quot;C#&amp;quot;&lt;/span&gt;%&amp;gt;&lt;br /&gt;&amp;lt;%  &lt;br /&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; authHeaderSize = 0; &lt;br /&gt;    &lt;span class="kwrd"&gt;string&lt;/span&gt; username = Request.ServerVariables[&lt;span class="str"&gt;&amp;quot;AUTH_USER&amp;quot;&lt;/span&gt;]; &lt;br /&gt;    &lt;span class="kwrd"&gt;if&lt;/span&gt; (username == &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        Response.Write(&lt;span class="str"&gt;&amp;quot;&amp;lt;br/&amp;gt;Authentication is not enabled&amp;quot;&lt;/span&gt;);    &lt;br /&gt;    }&lt;br /&gt;    &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br /&gt;    {&lt;br /&gt;        authHeaderSize = Request.Headers[&lt;span class="str"&gt;&amp;quot;Authorization&amp;quot;&lt;/span&gt;].Length;&lt;br /&gt;        Response.Write(&lt;span class="str"&gt;&amp;quot;&amp;lt;h2&amp;gt;Size of &amp;quot;&lt;/span&gt; + &lt;br /&gt;                        username + &lt;br /&gt;                        &lt;span class="str"&gt;&amp;quot;'s Authorization header: &amp;lt;br/&amp;gt;&amp;lt;b&amp;gt;&amp;quot;&lt;/span&gt; + &lt;br /&gt;                        authHeaderSize + &lt;br /&gt;                        &lt;span class="str"&gt;&amp;quot;&amp;lt;/b&amp;gt; bytes. &amp;lt;p/&amp;gt;&amp;lt;/h2&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;        Response.Write(&lt;span class="str"&gt;&amp;quot;&amp;lt;h2&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;b&amp;gt;Group Memberships for user &amp;quot;&lt;/span&gt; + username + &lt;span class="str"&gt;&amp;quot;:&amp;lt;/b&amp;gt;&amp;lt;/h2&amp;gt;&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; count=0;&lt;br /&gt;        System.Security.Principal.WindowsIdentity winId = &lt;br /&gt;                (System.Security.Principal.WindowsIdentity)HttpContext.Current.User.Identity;&lt;br /&gt;        &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (System.Security.Principal.IdentityReference ir &lt;span class="kwrd"&gt;in&lt;/span&gt; winId.Groups)&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                Response.Write(&lt;span class="str"&gt;&amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;/span&gt; + &lt;br /&gt;                               ((System.Security.Principal.NTAccount)ir.Translate&lt;br /&gt;                               (&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(System.Security.Principal.NTAccount))).Value);   &lt;br /&gt;                count++;   &lt;br /&gt;            }&lt;br /&gt;            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception inner)&lt;br /&gt;            {&lt;br /&gt;                Response.Write(&lt;span class="str"&gt;&amp;quot;&amp;lt;br/&amp;gt; --- cannot resolve group ---&amp;quot;&lt;/span&gt;);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        Response.Write(&lt;span class="str"&gt;&amp;quot;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;b&amp;gt;You are member of &amp;quot;&lt;/span&gt; + count + &lt;span class="str"&gt;&amp;quot; groups.&amp;lt;/b&amp;gt;&amp;quot;&lt;/span&gt;); &lt;br /&gt;    }   &lt;br /&gt; %&amp;gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session-based Authentication
    &lt;br /&gt;&lt;/strong&gt;Another problem I discovered while looking at the issue: when Kerberos authentication is used IIS7 and IIS 7.5 force the re-authentication of every request. This is unfortunate because it doesn't scale well. Just imagine a single html page with 50 images. If your Kerberos header is 10kB Internet Explorer sends 510kB (51 requests x10kB authorization header) only for authentication purposes. &lt;/p&gt;

&lt;p&gt;When NTLM is used on the other hand, session-based authentication is enabled. If session-based authentication is enabled authentication only has to be done per TCP/IP session. This scales much better because Internet Explorer usually creates only &lt;a href="http://msdn.microsoft.com/en-us/library/cc304129(VS.85).aspx" target="_blank"&gt;2 to 6 TCP/IP connections&lt;/a&gt; to a web server. HTTP requests are then done within these TCP/IP sessions, i.e. the connections are reused to make multiple requests. So if session-based authentication is enabled instead of sending 510kb authentication headers only 20-60kb authentication headers will be sent by IE. &lt;/p&gt;

&lt;p&gt;I'm still investigating why session-based authentication is not used for Kerberos - I hope there is a good reason for it :). There is a configuration property in IIS7.x that allows you to switch Kerberos to session-based authentication. It is the AuthPersistNonNTLM property. If you want to turn on server-wide session-based authentication for Kerberos here is your command: &lt;/p&gt;

&lt;div class="csharpcode-wrapper"&gt;
  &lt;pre class="csharpcode"&gt;&lt;br /&gt;%windir%\system32\inetsrv\appcmd.exe set config -section:windowsAuthentication /authPersistNonNTLM:&lt;span class="str"&gt;&amp;quot;True&amp;quot;&lt;/span&gt; /commit:apphost&lt;/pre&gt;
&lt;/div&gt;

&lt;div class="csharpcode-wrapper"&gt;That's it for today. &lt;/div&gt;

&lt;div class="csharpcode-wrapper"&gt;&amp;#160;&lt;/div&gt;

&lt;div class="csharpcode-wrapper"&gt;Thomas&lt;/div&gt;

&lt;div class="csharpcode-wrapper"&gt;
  &lt;br /&gt;&lt;/div&gt;&lt;img src="http://blogs.iis.net/aggbug.aspx?PostID=3474780" width="1" height="1"&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eX2alzftFMdKjmpe2L3UneE8UpE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eX2alzftFMdKjmpe2L3UneE8UpE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eX2alzftFMdKjmpe2L3UneE8UpE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eX2alzftFMdKjmpe2L3UneE8UpE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=6_l56CrHgHg:3X8dnF9G9Uc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=6_l56CrHgHg:3X8dnF9G9Uc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=6_l56CrHgHg:3X8dnF9G9Uc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=6_l56CrHgHg:3X8dnF9G9Uc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?i=6_l56CrHgHg:3X8dnF9G9Uc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?a=6_l56CrHgHg:3X8dnF9G9Uc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JustAnotherIISBlog?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JustAnotherIISBlog/~4/6_l56CrHgHg" height="1" width="1"/&gt;</description><feedburner:origLink>http://blogs.iis.net/thomad/archive/2009/10/23/kerberos-authentication-issues.aspx</feedburner:origLink></item></channel></rss>

