3

I have deployed an ASP.NET 4 web site to IIS 7 on Windows Server 2008. When I browse to the root folder, or any other folder in the site, the server responds by delivering the default page Default.aspx as you would expect. However, when I request a specific page with an .aspx extension, I get a 404 error.

For example, when I request:

http://localhost/MyWeb/

the server successfully delivers http://localhost/MyWeb/Default.aspx. However, if I explicitly request:

http://localhost/MyWeb/Default.aspx

then IIS responds with a 404 error.

The error details are as follows:

Module: IIS Web Core
Notification: MapRequestHandler
Handler: StaticFile
Error code: 0x80070002

The .NET framework is obviously installed and working, since I can get to default pages. By the way, I have observed that when the server fails and shows a 404 error page, the URL that I entered (such as http://localhost/MyWeb/Default.aspx) drops the extension (and reads http://localhost/MyWeb/Default).

I have tried running aspnet_iisreg -i and restarting the server, but things haven't changed.

What am I missing? Thank you.

UPDATE. I am posting here the web.config of my site. There are no other config files that apply to it.

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>

  <appSettings>
    <add key="DatabaseServer" value="CONWAY\SQLEXPRESS"/>
    <add key="DatabaseName" value="KaleidoScape"/>
    <add key="User" value="KaleidoScapeUser"/>
    <add key="Password" value="Scape1!"/>
  </appSettings>

  <system.web>

    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1" />

    <pages>
      <namespaces>
        <add namespace="System.Web.Optimization" />
      </namespaces>
      <controls>
        <add assembly="Microsoft.AspNet.Web.Optimization.WebForms" namespace="Microsoft.AspNet.Web.Optimization.WebForms" tagPrefix="webopt" />
        <add tagPrefix="uc" tagName="FileGallery" src="~/Controls/FileGallery/FileGallery.ascx" />
      </controls>
    </pages>

    <authentication mode="Forms">
      <forms defaultUrl="~/App" loginUrl="~/Default.aspx" slidingExpiration="true" timeout="120" name="Incipit.KaleidoScape" />
    </authentication>

    <authorization>
      <allow users="*" />
    </authorization>

  </system.web>

  <location path="App">
    <system.web>
      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>
  </location>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" culture="neutral" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
      </dependentAssembly>      
    </assemblyBinding>
  </runtime>
  <system.codedom>
    <compilers>
      <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
      <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:14 /nowarn:41008 /define:_MYTYPE=\&quot;Web\&quot; /optionInfer+" />
    </compilers>
  </system.codedom>
</configuration>

UPDATE. The IIS log entries for a failed request are as follows:

2016-10-23 21:13:22 127.0.0.1 GET /MyWeb/MyPage.aspx - 80 - 127.0.0.1 Mozilla/5.0+(compatible;+MSIE+9.0;+Windows+NT+6.0;+WOW64;+Trident/5.0) 301 0 0 46
2016-10-23 21:13:22 127.0.0.1 GET /MyWeb/MyPage - 80 - 127.0.0.1 Mozilla/5.0+(compatible;+MSIE+9.0;+Windows+NT+6.0;+WOW64;+Trident/5.0) 404 0 2 0

Note that there are two entries. The first one corresponds to MyPage.aspx, which is the page I requested by typing on the URL field. This results in a 301 (moved permanently) error. Immediately after, there is an entry for the same page without the .aspx extension, which results in a 404 error with substatus 0. I don't understand why the full URL gets a 301, and why the server then tries to deliver (and fails) a page without the extension.

UPDATE. I've just run an interesting experiment. I created a new web application on my server, having a single Test.aspx file. It worked as expected, i.e. the server delivers the page when you request it explicitly. Then I copied all the contents from the web site that is giving me headaches, and Test.aspx stopped working! Then, I deleted everything from this web except for the Test.aspx file, and it didn't revert back to working, but stayed failing. In conclusion, there's something in the web content that screws things up, and which persists after you delete the content. This is a web site I created with Visual Studio 2015 by using a project template that comes with Bootstrap and a few other things. I am utterly confused.

  • I guess you also noticed "Handler: StaticFile" which would be wrong. In case it helps people debug: what if you add a plain HTML file named Default (without extension) to the file system? – Arjan Oct 23 '16 at 11:15
  • @Arjan: Yes, I know StaticFile is wrong. Somehow the server is not handling ASPX files properly. But I don't know why. – CesarGon Oct 23 '16 at 11:25
  • So, is a file called Default served if it exists, when explicitly requesting http://localhost/MyWeb/Default.aspx? "Somehow the server is not handling ASPX files properly" -- or it is redirecting to the non-.aspx-extension version before even trying. – Arjan Oct 23 '16 at 11:27
  • No. The server still gives the 404 error. – CesarGon Oct 23 '16 at 11:31
  • Have you configured ASP.NET for localhost or only for MyWeb? – harrymc Oct 23 '16 at 16:25
2

After much research, I found a solution to this. I should say that I know how to fix the problem, but I am still not sure why the problem occurs.

The issue is related to the "friendly URLs" mechanism that is available in IIS 7. I deactivated them by changing the code in App_Start\RouteConfig.cs from:

var settings = new FriendlyUrlSettings();
settings.AutoRedirectMode = RedirectMode.Permanent;
routes.EnableFriendlyUrls(settings);

to:

var settings = new FriendlyUrlSettings();
settings.AutoRedirectMode = RedirectMode.Off;
routes.EnableFriendlyUrls(settings);

This has fixed the issue. As far as I understand, friendly URLs are about dropping file extensions, and I guess that's why I get the 301 error and a subsequent attempt for an extension-less file every time I request a page. However, I don't know why IIS fails to deliver the file.

Anyway, it's fixed now. Thanks to all who helped diagnose the problem.

  • For future readers, or in case you still want to solve the original problem: maybe the routes in RouteConfig include the .aspx suffix then? – Arjan Oct 24 '16 at 19:44
  • @Arjan: I am not sure I follow you. No routes are explicitly used in the web site. – CesarGon Oct 24 '16 at 19:47
  • 2
    Ah, looking at a few examples I figured that the RouteConfig file would define routes. Oh well, solved for you :-) – Arjan Oct 24 '16 at 19:49
  • So I was right - this was a redirection problem. – harrymc Oct 24 '16 at 19:57
  • 1
    So I was right - this was a redirection problem. ;-) – Arjan Oct 24 '16 at 20:16

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.