Я хочу иметь возможность генерировать стандартный ответ 404 IIS, а не пользовательскую страницу 404, в ответ на условие ошибки в классе code-behind.Мой Page_Load
метод выглядит следующим образом:
protected void Page_Load(object sender, System.EventArgs e)
{
this.a = ...
...
if (this.a == null) ... // *** generate a 404
}
Так что, если a
не равно нулю, .aspx
рендеринг файла и т. Д., Но если a
равно нулю, я хочу стандарт "Ресурс не может быть найден " страница для показа с кодом ответа 404.
Если я использую:
if (a == null) Response.StatusCode = 404;
(что является правильным методом в соответствии счто я могу найти) страница продолжает отображаться (и выдает NullReferenceException
с кодом ответа 500, когда она пытается использовать a
).
Если я использую:
if (a == null) throw new HttpException(404, "Not found");
Код ответа - 404, но содержимое страницы является страницей необработанного исключения ASP.NET, показывающей исключение HttpException (которое затем отображается как общая «Ошибка времени выполнения», если customErrors
равно On
).
IЯ хочу показать страницу 404 IIS, потому что пользователи это поймут, но они, вероятно, не будут проверять код ответа страницы, если он показывает ошибку сервера.
РЕДАКТИРОВАТЬ : похожеЯ не могу сделать это точно.Учитывая ответ @ Smudge202, я позволил своему программному коду выбросить HttpException
и добавил код к Global.Application_Error()
для обработки этих исключений:
void Application_Error(object sender, EventArgs e)
{
var exception = Server.GetLastError();
if (exception is HttpException)
{
var httpException = (HttpException)exception;
if (httpException.GetHttpCode() == 404)
{
var context = HttpContext.Current;
context.Response.Clear();
context.Response.StatusCode = 404;
context.Response.StatusDescription = "Not Found";
context.Response.Write("<h1>404 Not Found</h1>");
context.Server.ClearError();
}
}
// ...
}
Это позволяет мне установить собственный ответ на исключение.У этого подхода есть два недостатка:
- Что я действительно хотел сделать, так это вернуть управление обратно в IIS и позволить ему отображать ответ по умолчанию 404, я не могу найти способ сделать это
- Новый ответ (записанный
context.Response.Write()
) показан для каждых 404, а не только для тех, которые сгенерированы в коде
Так что, похоже, мне потребуется либо:
- Из выделенного кода перенаправьте на сделанную на заказ страницу, объясняющую, что «вещь» не может быть найдена (которая также устанавливает код ответа 404), или
- Установите пользовательскую глобальную страницу 404