Установка ResponseCode вручную в CodeBehind не работает с IIS7 и 2008 Server

Год назад я разработал веб-приложение, предназначенное для работы с IIS6. Сейчас мы переходим на IIS7, и я подумал, что проведу несколько интеграционных тестов.

Одна из них не работает:
Веб-приложение является более или менее поисковой системой, выдающей 404 или 500 (благодаря вашему советнику Google ...), когда не было никаких результатов или контейнер данных не загружено еще. С IIS6 это отлично работало: вывод страницы был например. result.aspx, показывая какое-то сообщение и возвращая указанный статус http (установленный в codebehind).
Теперь с IIS7 это поведение нарушено: если я установлю код статуса http в codebehind, моя страница больше не будет доставляться - вместо этого отображается страница общей ошибки IIS7.

Нет, я не хочу делать какие-либо грязные взломы с помощью customErrors-Section ... Я просто хочу вернуть исходное поведение!
Есть ли способ сделать это?

Изменить:
Рассмотрите следующую страницу

<%@ 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 = OK
2008 Server + IIS7 = Общая страница ошибок


person Community    schedule 07.09.2009    source источник


Ответы (2)


вы пробовали это:

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

    Response.TrySkipIisCustomErrors = true;
}

Свойство HttpResponse.TrySkipIisCustomErrors (System.Web)

person manji    schedule 11.09.2009
comment
хе-хе ... нет - еще нет ... завтра попробую! - person ; 14.09.2009

Вероятно, ваша проблема заключается в том, что вы пытались установить код состояния (который считается частью заголовка) в какой-то момент после того, как вы начали отправлять тело ответа, то есть содержимое ваших страниц - в вашем случае сообщение.

Чтобы решить эту проблему, вы можете попробовать установить Response.Buffer значение true, а затем, если вам нужно установить код ответа 404/500, вызовите Response.Clear () перед установкой кода ответа.

Обратите внимание, что если вы отправляете 404/500, то в ответе обычно не должно быть тела (хотя спецификация HTTP допускает это).

person RobV    schedule 07.09.2009
comment
Я устанавливаю StatusCode @ OnLoad (где я связываюсь со своей веб-службой). Вывод страницы обычно осуществляется методом Render. Я не хочу очищать свой первоначальный ответ, который является нормальной страницей результатов, просто с другим сообщением. - person ; 08.09.2009
comment
Вы пробовали просто включить Response.Buffer (но не очищать ответ) и посмотреть, работает ли это? - person RobV; 10.09.2009
comment
нет - я установил this.Response.Buffer в true, не помогло ... Я никогда не очищаю свой ответ - просто устанавливаю StatusCode. - person ; 11.09.2009