我已经将 ASP.NET 4 网站部署到 Windows Server 2008 上的 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
并重新启动服务器,但情况并没有改变。
我遗漏了什么?谢谢。
更新。我在这里发布了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=\"Web\" /optionInfer+" />
</compilers>
</system.codedom>
</configuration>
更新。失败请求的 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
,这会导致 404 错误,子状态为 0。我不明白为什么完整的 URL 会得到 301,以及为什么服务器随后尝试传递(并失败)没有扩展名的页面。
更新。我刚刚做了一个有趣的实验。我在服务器上创建了一个新的 Web 应用程序,其中包含一个Test.aspx
文件。它按预期工作,即服务器在您明确请求时提供页面。然后我从让我头疼的网站上复制了所有内容,然后Test.aspx
停止工作!然后,我删除了此网站上除Test.aspx
文件之外的所有内容,它并没有恢复工作,而是继续失败。总之,Web 内容中有些东西搞砸了事情,并且在您删除内容后仍然存在。这是我使用 Visual Studio 2015 使用 Bootstrap 附带的项目模板和其他一些东西创建的网站。我完全糊涂了。
答案1
经过大量研究,我找到了解决方案。我应该说我知道如何修复这个问题,但我仍然不确定为什么会出现这个问题。
该问题与 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 无法传递文件。
无论如何,现在已经修复。感谢所有帮助诊断问题的人。