IIS7 404错误

时间:2011-02-25 09:47:27

标签: asp.net iis-7 http-status-code-404

我在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的“正确方法”的任何建议或文章?

4 个答案:

答案 0 :(得分:3)

我也因为iis 7而陷入困境......你可以试试这个,因为它对我有用......

<httpErrors existingResponse="PassThrough" />

此人也有与您相同的问题。 IIS7 Overrides customErrors when setting Response.StatusCode?

这是对http://www.fidelitydesign.net/?p=21

发生的事情的诠释

答案 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("~/");