我在IIS 7中运行了一个ASP.NET 3.5站点 我试图让404第一次抛出404状态代码。
目前,如果您输入
http://www.madeupsiteforexample.com/somethingmadeup
你收到302跟随200 我试图让这个第一次抛出404代码并显示我设置的404页面(/FileNotFound.aspx)
我遇到的问题是404页面显示的是200个代码,或者当IIS看到404状态代码并显示自己可怕的404页面而不是我自定义创建的页面时,IIS会接管。
我尝试过使用模块,global.asax并在我的404页面后面的代码上设置状态代码。所有这些都导致IIS接管。
这是我的Global.asax实现
protected void Application_Error(object sender, EventArgs e)
{
Response.TrySkipIisCustomErrors = true;
Response.StatusCode = 404;
}
现在我确实通过Server解决了这个问题。转发我的请求 但是,这会导致所有会话都为null,并且引用Session的任何代码都会导致异常。此外,尝试从资源文件中检索项目的代码会导致异常。
关于在IIS7中执行404的“正确方法”的任何建议或文章?
答案 0 :(得分:3)
我也因为iis 7而陷入困境......你可以试试这个,因为它对我有用......
<httpErrors existingResponse="PassThrough" />
此人也有与您相同的问题。 IIS7 Overrides customErrors when setting Response.StatusCode?
发生的事情的诠释答案 1 :(得分:0)
看看这个tutorial,通过配置设置自定义错误页面是正常的,而不是代码。
答案 2 :(得分:0)
您可以通过修改“默认网站”(或特定于您的应用程序)下的“错误页面”设置来更改在404显示的页面
答案 3 :(得分:0)
如果您希望Session仍然可用,请使用Server.TransferRequest(IIS6中不支持)而不是Server.Transfer。
但我首选的方法是在Response.StatusCode = 404;
中调用FileNotFound.aspx
并将web.config设置为:
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
<remove statusCode="404" subStatusCode="-1"/>
<error statusCode="404" prefixLanguageFilePath="" path="/FileNotFound.aspx" responseMode="ExecuteURL"/>
</httpErrors>
</system.webServer>
对于其他人,如果你像我一样只是显示主页上面有404错误的消息,你可以测试它是否是404请求,因为内部新请求的状态代码被附加到网址即ie
if (Request.Url.ToString().Contains("?404;"))
{
Response.StatusCode = 404;
Util.DisplayMessage("The page you are looking for no longer exists. If you navigated to this page by clicking a link within this site please <a href='" + ResolveUrl("~/contact.aspx") + "'>contact us</a> to let us know.");
}
如果图像,脚本等的路径相对于FileNotFound.aspx
(即不是站点根'/路径'或在服务器'〜/ path'处解析)和缺少的页面(即当前网址)位于不同的文件夹中。为了解决这个问题,我告诉浏览器使用基本标记建立FileNotFound.aspx
所在位置的相对路径,并告诉服务器与Context.RewritePath匹配,即
Page.Header.Controls.AddAt(0, new LiteralControl("<base href='" + Request.Url.Scheme + "://" + Request.Url.Authority + VirtualPathUtility.ToAbsolute("~/") + "'/>"));
Context.RewritePath("~/");