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) вручную добавить туда свои заголовки.