題 IIS 7無法提供.aspx頁面,但可以使用默認文件


我已經在Windows Server 2008上將IIS 4網站部署到IIS 7.當我瀏覽到根文件夾或站點中的任何其他文件夾時,服務器通過提供默認頁面進行響應 Default.aspx 正如你所料。但是,當我請求具有的特定頁面時 .aspx 擴展,我收到404錯誤。

例如,當我請求時:

http://localhost/MyWeb/

服務器成功交付 http://localhost/MyWeb/Default.aspx。但是,如果我明確要求:

http://localhost/MyWeb/Default.aspx

然後IIS響應404錯誤。

錯誤詳情如下:

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

.NET框架顯然已安裝並正常工作,因為我可以訪問默認頁面。順便說一下,我觀察到當服務器出現故障並顯示404錯誤頁面時,我輸入的URL(例如 http://localhost/MyWeb/Default.aspx)刪除擴展(並讀取 http://localhost/MyWeb/Default)。

我試過跑步 aspnet_iisreg -i 並重新啟動服務器,但事情沒有改變。

我錯過了什麼?謝謝。

UPDATE。我在這裡張貼了 web.config 我的網站。沒有適用於它的其他配置文件。

<?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。失敗請求的IIS日誌條目如下:

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

請注意,有兩個條目。第一個對應於 MyPage.aspx,這是我在URL字段中輸入所請求的頁面。這會導致301(永久移動)錯誤。緊接著之後,沒有相同頁面的條目 .aspx 擴展,導致與子站0的404錯誤。我不明白為什麼完整的URL獲得301,以及為什麼服務器然後嘗試傳遞(並失敗)沒有擴展名的頁面。

UPDATE。我剛做了一個有趣的實驗。我在我的服務器上創建了一個新的Web應用程序,只有一個 Test.aspx 文件。它按預期工作,即服務器在您明確請求時傳遞頁面。然後我複制了令我頭疼的網站上的所有內容 Test.aspx 停止工作!然後,我刪除了除此之外的所有內容 Test.aspx 文件,它沒有恢復工作,但仍然失敗。總而言之,Web內容中的某些內容會使事情變得棘手,並且在刪除內容後會持續存在。這是我使用Visual Studio 2015創建的網站,它使用了Bootstrap附帶的項目模板和其他一些東西。我完全糊塗了。


3
2017-10-20 09:34


起源


我猜你也注意到了“Handler:StaticFile”,這是錯誤的。如果它可以幫助人們調試:如果添加一個名為的純HTML文件,該怎麼辦? Default (沒有擴展名)到文件系統? - Arjan
@Arjan:是的,我知道StaticFile是錯誤的。不知何故,服務器沒有正確處理ASPX文件。但我不知道為什麼。 - CesarGon
所以,是一個名為的文件 Default 如果存在,則在明確請求時提供 http://localhost/MyWeb/Default.aspx? “不知何故,服務器沒有正確處理ASPX文件”  - 或者甚至在嘗試之前重定向到非.aspx擴展版本。 - Arjan
不。服務器仍然提供404錯誤。 - CesarGon
您是為localhost配置了ASP.NET還是僅為MyWeb配置了ASP.NET? - harrymc


答案:


經過大量研究,我找到了解決方案。我應該說我知道如何解決問題,但我仍然不確定為什麼會出現這個問題。

該問題與IIS 7中提供的“友好URL”機制有關。我通過更改代碼來停用它們 App_Start\RouteConfig.cs 從:

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

至:

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

這解決了這個問題。據我了解,友好的URL是關於刪除文件擴展名,我想這就是為什麼我每次請求頁面時都會收到301錯誤以及後續嘗試無擴展文件的原因。但是,我不知道為什麼IIS無法傳遞文件。

無論如何,它現在已經修好了。感謝所有幫助診斷問題的人。


2
2017-10-24 17:17



對於未來的讀者,或者如果您仍想解決原始問題:RouteConfig中的路由可能包含.aspx後綴嗎? - Arjan
@Arjan:我不確定我是否跟著你。網站中未明確使用任何路由。 - CesarGon
啊,看幾個例子,我認為RouteConfig文件會定義路由。哦,好了,為你解決了:-) - Arjan
所以我說得對 - 這是一個重定向問題。 - harrymc
所以我說得對 - 這是一個重定向問題。 ;-) - Arjan