代码之家  ›  专栏  ›  技术社区  ›  Andreas Niedermair

在codebehind手动设置responseCode在iis7和2008服务器上失败

  •  0
  • Andreas Niedermair  · 技术社区  · 15 年前

    一年前我开发了一个网络应用程序,旨在与iis6合作。 现在我们转到IIS7,我想,我会做一些集成测试。

    其中一个失败:
    网络应用或多或少是一个搜索引擎,当没有任何结果或数据容器尚未加载时,它会给出404或500(感谢你的谷歌顾问…)。对于iis6,这非常有效:页面输出为result.aspx,显示一些消息并返回指定的HTTP状态(设置为codebehind)。
    现在,对于iis7,这种行为被破坏了:如果我将HTTP状态代码设置为codebehind,我的页面将不再被传递,而是显示iis7的通用错误页面。

    不,我不想做任何肮脏的黑客与客户错误部分… 我只想恢复原来的行为!
    有什么办法吗?

    编辑:
    考虑下一页

    <%@ Page Language="C#" AutoEventWireup="true"%>
    
    <script runat="server">
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
    
            this.Response.StatusCode = 404;
        }
    </script>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            This page should be displayed
        </div>
        </form>
    </body>
    </html>
    

    vista+iis7=好
    2008服务器+iis7=一般错误页

    2 回复  |  直到 15 年前
        1
  •  6
  •   manji    15 年前

    您是否尝试过:

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        this.Response.StatusCode = 404;
    
        Response.TrySkipIisCustomErrors = true;
    }
    

    HttpResponse.TrySkipIisCustomErrors Property (System.Web)

        2
  •  0
  •   RobV    15 年前

    您的问题可能是,在开始发送响应正文(即页面内容)之后的某个时间点,您试图设置状态代码(作为标题的一部分)。

    要解决此问题,可以尝试将response.buffer设置为true,然后如果必须设置404/500响应代码,则在设置响应代码之前调用response.clear()。

    注意,如果您发送的是404/500,那么响应通常没有正文(尽管HTTP规范允许这样做)。