ASP.NET переписанные пользовательские ошибки не отправляют заголовок типа контента

У меня есть следующая конфигурация в моем web.config:

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/Error.html">
    <error statusCode="404" redirect="~/Error/Error.html" />
    <error statusCode="400" redirect="~/Error/Error.html" />
</customErrors>

FWIW, это приложение ASP.NET MVC 3.

Когда я генерирую ошибку. Например, посетив..

http://testserver/this&is&an&illegal&request

.., который заблокирован проверкой запроса ASP.NET, возвращается страница с ошибкой, но заголовка содержимого нет. IE передает содержимое и отображает HTML, однако Firefix (правильно IMO) рассматривает содержимое как текст и отображает HTML-код.

Есть ли дополнительные шаги, которые мне нужно предпринять, чтобы убедить ASP.NET отправлять заголовок типа контента? Я предполагаю, что это связано с тем, что он выбирает файлы из файловой системы, но типы MIME выглядят правильно настроенными на сервере.

Ответы

Ответ 1

Мое приложение ASP.NET MVC 2 корректно отправляло заголовок типа контента - Content-Type: text/html. Затем он начал эту странную проблему после обновления пула приложений с .Net Framework v2 до .NET Framework v4. Я использую следующую конфигурацию

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/500.html">
    <error statusCode="404" redirect="/404.html" />
</customErrors>

и я хотел придерживаться статических страниц для своих пользовательских страниц ошибок.

Единственное решение, о котором я мог думать, - это явно указать заголовок в методе Application_Error класса MvcApplication в файле Global.asax.cs.

public class MvcApplication : System.Web.HttpApplication
{
    // .
    // .
    // .
    void Application_Error(object sender, EventArgs e)
    {
        // .
        // Remember to set Response.StatusCode and
        // Response.TrySkipIisCustomErrors
        // .
        Response.ContentType = "text/html";
        // .
        // .
        // .
    }
    // .
    // .
    // .
}

Немного раздражает, но самое простое решение, которое пришло мне в голову.

Ответ 2

С страницей статической ошибки файла я не нашел никакого решения.

Используя страницу динамической ошибки, заголовки правильно установлены. Но вы можете потерять код состояния ошибки в процессе и затем установить его самостоятельно в код страницы ошибки. (Это несколько ответ rangitatanz, но, возможно, написан более явно.)

Итак, вот пример, который я использую (способ веб-формы):

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/unknown.aspx">
    <error statusCode="404" redirect="~/Error/404.aspx" />
    <error statusCode="400" redirect="~/Error/400.aspx" />
</customErrors>

И в загрузке страницы (здесь для 404):

protected void Page_Load(object sender, EventArgs e)
{
    Response.StatusCode = 404;
    Response.StatusDescription = "Not found";
    Response.TrySkipIisCustomErrors = true;
}

Это может быть использовано в проекте MVC. Если вы не хотите смешивать веб-формы и MVC, вы можете написать контроллер ошибок для этого со своими связанными представлениями. (Именно так я и хожу в моем проекте MVC, но в настоящее время я вернусь к веб-форме, и поэтому я повторно решил, что с помощью webform.)

Ответ 3

ASP.Net не будет отправлять этот IIS. Если вы хотите, чтобы ASP.Net отправил его, попробуйте добавить Error.aspx и посмотреть, как это выглядит?

Я имею в виду, что вы будете отправлены на html-страницу, которая, если вы не подключили IIS для запуска их через aspnet, тогда он будет нормально обслуживаться.

Если вы добавляете новую страницу error.aspx, вы можете: a) проверить, исправлена ​​ли ASP.Net ваша проблема, или b) вручную добавить туда свои заголовки.