Jeff Widmer's Blog

ASP.NET, ASP.NET MVC, C#, VB.NET, IIS7, Windows Forms, VB6, ASP 3.0

  • How to detect if the new HTML5 File Upload progress information is available in your browser

    HTML5 has a some new File Upload features added to it must notably upload progress notifications while the file is being posted to the server through the XMLHttpRequest Level 2 (XHR2) object (

    Keep in mind that XMLHttpRequest Level 2 is not really HTML5 but as mentioned in this article, it is part of the core platform improvements and therefore frequently gets included under the HTML5 name umbrella:

    One of the unsung heroes in the HTML5 universe is XMLHttpRequest. Strictly speaking XHR2 isn't HTML5. However, it's part of the incremental improvements browser vendors are making to the core platform.

    Chrome, Firefox, Safari, and IE10 all support the new XHR2 progress events but unfortunately IE9 does not so you will need to check for them and fall back to something like SWFUpload to give you progress information while your file is posting to the server if the XHR2 object is not available.

    But how do you test to see if the browser supports the new features of XMLHttpRequest Level 2 (XHR2) for progress information?

    There is an interesting Modernizr thread here which talks about the various ways to test for it.  In the end all you need to test for is the existence of window.FormData.

    If you want to add an XHR2 test into Modernizr you can do it like this:

            Modernizr.addTest('xhr2', 'FormData' in window);
            if (Modernizr.xhr2) {
                 alert('File upload progress supported');
            } else {
                 alert('No file upload progress support');
    Or you can just do it by running your own check without Modernizr:
            if (!!window.ProgressEvent && !!window.FormData) {
                 alert('File upload progress supported');
            } else {
                 alert('No file upload progress support');

    Note: Technically the test for window.ProgressEvent being undefined is not necessary as shown in the above Modernizr thread but I left it in just for my own knowledge.

  • You are not authorized to view this page due to invalid authentication headers.

    I have been working through an authentication issue and making changes to IIS to debug the problem and then ran into the following IIS error:

    HTTP Error 401.2 - Unauthorized

    You are not authorized to view this page due to invalid authentication headers.


    It took me a while to figure out what the problem was and in the end the cause was already listed in the “Most likely causes” section of this error page:

    Most likely causes:

    • No authentication protocol (including anonymous) is selected in IIS.
    • Only integrated authentication is enabled, and a client browser was used that does not support integrated authentication.
    • Integrated authentication is enabled and the request was sent through a proxy that changed the authentication headers before they reach the Web server.
    • The Web server is not configured for anonymous access and a required authorization header was not received.
    • The "configuration/system.webServer/authorization" configuration section may be explicitly denying the user access.

    My issue is that I had been debugging an issue with Windows Authentication and I had disabled Anonymous Authentication and enabled Windows Authentication for this website in IIS (I know you are not supposed to have both Forms Authentication and Windows Authentication enabled at the same time... this was for a test). 


    When I had finished I thought I had reset everything back but I forgot to enable Anonymous Authentication.  Just enabling Anonymous Authentication resolved the issue.


  • Show detailed Classic ASP error messages in IIS7 for both local and remote requests

    In IIS7 you have to enable sending the detailed error message for Classic ASP.  You can do this by configuring Classic ASP in IIS7:


    And then setting the “Send Errors to Browser” setting to true:


    Now you will get the detailed Classic ASP error message when an error occurs in your Classic ASP pages.  But these will only show for local requests.  Remote requests will still display the standard IIS 500 - Internal Server Error:


    Not sending detailed error messages for remote requests is the default since it is a good idea for remote requests not to see the full error details (it could expose sensitive data to the Internet).  But if you need to see it, such as on an internal testing server, follow these instructions to have IIS send the detailed error message for remote requests too.

    In IIS go to the Error Pages:

    Then on the right click on the Edit Feature Settings...

    In the Edit Error Pages Settings dialog is where you choose to send for both local and remote requests.  The second option button is what needs to be selected to have the detailed errors returned for both local and remote requests.  The bottom option is what is on by default – where detailed error messages are only sent for local requests. 
    Keep in mind that it is not recommended to send detailed errors for remote requests since this could expose sensitive information to the Internet.

  • Building the Ultimate Developer Computer for $1000 - The Parts List

    I am due for a new computer.  Following on the foot steps of Scott Hanselman (Ultimate Developer PC 2.0) and Jeff Atwood (Building a PC, Part VII: Rebooting) I decided to build my own computer.  I have built my own machine before but in the past it has been with mixed success.  Usually I have run into issues with getting a complete set of compatible parts, or fitting all of the components into the case.

    Prior to giving building my own computer another try, I did shop around for pre-built computers (Dell, CyberPower).  The prices of some pre-built computers certainly do make just buying one from a company like Dell or CyberPower very attractive (and also you are practically guaranteed a fully compatible set of hardware), but you do not always get the high-performance machine that I wanted (at least not without paying a premium).  So not only is building my own machine about putting together a high-performance computer, it also has to be very cost effective to be a better deal than prebuilt off-the-shelf computers. 

    I set $1000 as the goal because above $1000 I felt I could get a pretty decent machine from one of the pre-built shops (albeit maybe with some components that I did not necessarily want).  The $1000 price goal also made an assumption that I might sacrifice on some parts knowing that I could upgrade them in the future if this goes well. 

    So here goes... below is the list of parts that I selected to build my $1000 Ultimate Developer Machine.

    I borrowed heavily from Jeff Atwood’s latest post on rebuilding his machine.  He posted it in July 2011 so the parts list was still very up to date.  The only issue was that his selected parts cost just under $2000 and, as mentioned above, I wanted to have it at or under $1000.

    Pulling from his list of parts and skimping and saving where I could I came up with the following parts that I finally went with.  I will talk about each of these later in this post.

    The total cost of the parts above was $972.62.  So below my goal of $1000.  To be fair though, I did reuse a hard drive from another machine: a Seagate 500 GB Hard Drive (Seagate Barracuda 7200.12 SATA 3Gb/s 500GB Hard Drive). 

    So that’s pretty much all you need to know to purchase an awesome machine for $1000. See this post (COMING SOON) which gives a decent set of step-by-step instructions on building this $1000 Ultimate Development Computer.  And then below I dive into each of the parts and why I decided to go with the one that I did (and also recommendations on potential substitutes).  Everything is just my opinion so take it as you may.

    And finally, here is the required Windows Experience Index screenshot after I had built the machine:image

    Motherboard - ASUS LGA 1155 - Z68 - SATA 6Gb/s and USB 3.0 - ATX Intel Z68 ATX DDR3 2200 Motherboard (P8Z68-V LE)

    • This was one of the big differences between Jeff Atwood’s build (Building a PC, Part VII: Rebooting) but it was also a big cost savings.  Below is a comparison of the major differences between the P8Z68-V PRO and the P8Z68-V LE motherboards from the Asus website (  The major difference which caused a minor issue was the lack of a IEEE 1394a port.  The Corsair case that I went with has an IEEE 1394a (firewire) outlet on the front so with the LE motherboard I did not have a place to plug it in.  This was not an issue for me because 1) I currently do not have any firewire devices and 2) I had an old (very old) IEEE 1394a PCI card which I added to allow me to plug it in (just because).  Depending on your Firewire needs you may want to upgrade (either a 1394 PCI card or the P8Z68-V PRO Motherboard). 
      • image
      • image
      • image

    Computer Case - Corsair CC600TWM-WHT Special Edition Graphite Series 600T Mid Tower Gaming Computer Case

    • This is the case recommended in Jeff Atwood’s build.  It is big and it is expensive but after building the machine I have absolutely no regrets spending the extra money on this case.  This case made it so much easier to put the machine together and the extra air flow is awesome.  Don’t skimp here... just buy this one.  I also assume that when I rebuild I will be able to reuse this case so it is a good investment. 

    Power Supply - Corsair Enthusiast TX V2 Series 550-Watt 80 Plus Bronze Certified High Performance Modular Power Supply

    • I did save some money on the power supply.  I knew I would not need as much power as the PSU recommended in Jeff Atwood’s build so I moved down to the 550-Watt and only Bronze certified power supply.  Nothing more to say here other than I traded a lower up-front costs with higher costs to power the machine (Bronze vs Gold). 

    Processor - Intel Core i5-2500K Processor

    • Big difference here compared to Jeff Atwood’s build (i5 vs i7) but it saved me about $100.  I can always upgrade in the future.  Notice that the processor is the limiting factor in the machine’s Windows Experience Index.  If you have the extra money then I would recommend the Intel Core i7 Processor but to keep costs under $1000 I stuck with this Intel Core i5.

    Solid State Drive (SSD) - Crucial 64 GB m4 2.5-Inch Solid State Drive SATA 6Gb/s

    • Once you step into the world of Solid State Drives you will never want to go back.  to quote Jeff Atwood: “I can't imagine using a computer without a SSD any more; it'd be like going back to dial-up internet or 13" CRTs or single button mice.” - The Hot/Crazy Solid State Drive Scale (May 2, 2011).  The SSD drive is what makes this machine blazing fast.  Notice the 7.9 on the Windows Experience Index for Primary Hard Drive.  I went with the small 64GB Crucial SSD once again to save on costs.  This is small for the operating system drive but it is doable.  Windows had to move the page file to the 7200 RPM drive with this small SSD so I am seeing a small performance decrease because of that.  Again if you have the money an excellent upgrade would be to the Crucial 128GB SSD.

    RAM - Corsair Vengeance Blue 16 GB DDR3 SDRAM Dual Channel Memory Kit

    • I didn’t want to go cheap on the RAM so I went with Jeff Atwood’s recommendation.

    Video Card - Sapphire HD 6850 PCIE Video Card

    • I don’t know much about video cards and I always have trouble figuring out why one is better than another.  I do know that one of my biggest complaints with my old machine is the video performance so I didn’t want to skimp here.  So without knowing better options I just went with Jeff Atwood’s recommendation.

    DVD Drive - Asus 24xDVD±RW Drive DVD-RAM/±R/±RW 24x8x16x(DVD) 48x32x48x(CD) Serial ATA Internal OEM DRW-24B1ST

    • I needed one of these.  This one was highly recommended on Amazon and it is an Asus.  Enough said.
      • image

    Hard DriveSeagate Barracuda 7200

    • I reused a Seagate 7200 RPM drive from another machine so technically you could say that I cheated and this development machine really cost more than $1000 if you take into account purchasing this drive.  But I imagine nearly all of us developers that are embarking on building our own machine already have several decent 7200 RPM drives sitting around to use.  If not you can get this one Seagate Barracuda 7200 for $129.
  • Final Flower


    Winter is on the horizon….

  • Remote Desktops MMC Snap-in on Windows 7

    Windows Server 2008 has a nice MMC Snap-in called “Remote Desktops” which provides a tree view of all of the Remote Desktop Connections for the various servers that you manage and then allows you to switch between them easily by just clicking on one of them in the tree view.  Windows 7 does not have this snap-in built-in by default but you can get it from the Remote Server Administration Tools update for Windows 7.  Below are instructions on how to configure your Windows 7 computer to use the Remote Desktops MMC Snap-in.

    Download and install the Remote Server Administration Tools for Windows 7 -

    Browse to Control Panel > Programs > Turn Windows features on or off.


    Scroll down to the “Remote Server Administration Tools” > “Role Administration Tools”.

    Check the “Remote Desktop Services Tools” checkbox.


    Now you will have the Remote Desktops Snap-in which allows you to have a tree view of the various Windows servers that you manage.

    Start > Run > mmc.exe

    File > Add/Remove Snap-in…

    And then add the Remote Desktops snap-in:




  • The configuration section 'system.web.extensions' cannot be read because it is missing a section declaration

    After upgrading an ASP.NET application from .NET Framework 3.5 to .NET Framework 4.0 I ran into the following error message dialog when trying to view any of the modules in IIS on the server.

    2011-11-08 11h01_09

    What happened is during the upgrade, the web.config file was automatically converted for .NET Framework 4.0.  This left behind an empty system.web.extensions section:


    It was an easy fix to resolve, just remove the unused system.web.extensions section.


    There was an error while performing this operation.
    Filename: \\?\web.config
    Line number: 171
    Error: The configuration section 'system.web.extensions' cannot be read because it is missing a section declaration

  • Interop type 'AssemblyName.ClassName' cannot be embedded

    I recently upgraded some Visual Studio 2008 projects to Visual Studio 2010.  Most everything went very smoothly but I did run into one issue with some COM assemblies that were part of the project.

    At first the ASP.NET Web Application project built without issues, but then I ran into this error when visiting one of the pages:

    Could not load file or assembly 'Interop.AssemblyName' or one of its dependencies. An attempt was made to load a program with an incorrect format.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
    Exception Details: System.BadImageFormatException: Could not load file or assembly 'Interop.AssemblyName' or one of its dependencies. An attempt was made to load a program with an incorrect format.

    My solution to this issue was to remove the COM Assembly from the Visual Studio references and then to add it back in.  (I am not sure this was the proper solution but it worked.)

    But then when I added the COM assembly back into the project as a reference I could not build the project with errors such as:

    Interop type 'AssemblyName.ClassName' cannot be embedded. Use the applicable interface instead. 

    And others indicating that the project was not seeing the reference to the COM assembly.  Luckily this StackOverflow question (Interop type cannot be embedded) had the answer.

    The solution is to change a property on the referenced COM assembly.  To do this, in your Visual Studio 2010 project expand the References section and right-click on the COM assembly and select Properties.  This will bring up the Properties dialog for the COM assembly reference.

    2011-11-03 06h42_17

    Just change the “Embed Interop Types” property from True to False.  Now just rebuild your project and everything will be working.


    UPDATE (2011-12-13): The above solution to remove the assembly and then add it back and then set the Embed Interop Type to false does resolve the issue but the problem is that after a Visual Studio 2008 project is upgraded to Visual Studio 2010 there is not EmbedInteropTypes element in the COMReference node in the Visual Studio project XML.  And also there is not a PlatformTarget node in the build configuration (see next item).

    By default the Visual Studio Properties Dialog shows no value as false.  The missing element is probably causing an issue elsewhere during the compilation.  The easy fix, instead of removing and adding the COM Interop assemblies back in, is to just toggle the Embed Interop Types property from False to True and then back to False.  This will put the element in the COMReference properties (as shown below in the screenshot) and then everything else will continue to work.


    In addition I have found that you need to toggle the Platform Target:


    Just change it to one of the other values and then change it right back to “Any CPU”. This will insert the appropriate PlatformTarget element in the project file (see screenshot below).  Make sure you do this for all build configuration (and not just the debug).


  • VB.NET IF() Coalesce and “Expression Expected” Error

    I am trying to use the equivalent of the C# “??” operator in some VB.NET code that I am working in.

    This StackOverflow article for “Is there a VB.NET equivalent for C#'s ?? operator?” explains the VB.NET IF() statement syntax which is exactly what I am looking for... and I thought I was going to be done pretty quickly and could move on.

    But after implementing the IF() statement in my code I started to receive this error:

    Compiler Error Message: BC30201: Expression expected.


    And no matter how I tried using the “IF()” statement, whenever I tried to visit the aspx page that I was working on I received the same error.

    This other StackOverflow article Using VB.NET If vs. IIf in binding/rendering expression indicated that the VB.NET IF() operator was not available until VS2008 or .NET Framework 3.5.  So I checked the Web Application project properties but it was targeting the .NET Framework 3.5:


    So I was still not understanding what was going on, but then I noticed the version information in the detailed compiler output of the error page:


    This happened to be a C# project, but with an ASPX page with inline VB.NET code (yes, it is strange to have that but that is the project I am working on).  So even though the project file was targeting the .NET Framework 3.5, the ASPX page was being compiled using the .NET Framework 2.0.  But why?  Where does this get set?  How does ASP.NET know which version of the compiler to use for the inline code?

    For this I turned to the web.config.  Here is the system.codedom/compilers section that was in the web.config for this project:

            <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089">
                <providerOption name="CompilerVersion" value="v3.5" />
                <providerOption name="WarnAsError" value="false" />

    Keep in mind that this is a C# web application project file but my aspx file has inline VB.NET code.  The web.config does not have any information for how to compile for VB.NET so it defaults to .NET 2.0 (instead of 3.5 which is what I need).

    So the web.config needed to include the VB.NET compiler option.  Here it is with both the C# and VB.NET options (I copied the VB.NET config from a new VB.NET Web Application project file).

                <compiler language="c#;cs;csharp" extension=".cs" warningLevel="4" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089">
                    <providerOption name="CompilerVersion" value="v3.5" />
                    <providerOption name="WarnAsError" value="false" />
          <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" warningLevel="4" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=, Culture=neutral, PublicKeyToken=b77a5c561934e089">
            <providerOption name="CompilerVersion" value="v3.5"/>
            <providerOption name="OptionInfer" value="true"/>
            <providerOption name="WarnAsError" value="false"/>


    So the inline VB.NET code on my aspx page was being compiled using the .NET Framework 2.0 when it really needed to be compiled with the .NET Framework 3.5 compiler in order to take advantage of the VB.NET IF() coalesce statement.  Without the VB.NET web.config compiler option, the default is to compile using the .NET Framework 2.0 and the VB.NET IF() coalesce statement does not exist (at least in the form that I want it in).  FYI, there is an older IF statement in VB.NET 2.0 compiler which is why it is giving me the unusual “Expression Expected” error message – see this article for when VB.NET got the new updated version.

    EDIT (2011-06-20): I had made a wrong assumption in the first version of this blog post.  After a little more research and investigation I was able to figure out that the issue was in the web.config and not with the IIS App Pool.  Thanks to the comment from James which forced me to look into this again.