Ответ 1
Context.Response.TrySkipIisCustomErrors = true
У меня есть однофайловая веб-служба ASP.Net(файл .ashx
, содержащий реализацию IHttpHandler
), которая должна иметь возможность возвращать ошибки в виде ответов с статусом 500 Internal Server Error коды. Это довольно простая задача в PHP:
header("HTTP/1.1 500 Internal Server Error");
header("Content-Type: text/plain");
echo "Unable to connect to database on $dbHost";
Эквивалент ASP.Net(С#):
Context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
Context.Response.ContentType = "text/plain";
Context.Response.Write("Unable to connect to database on " + dbHost);
Конечно, это не работает должным образом; вместо этого IIS перехватывает код состояния 500, уничтожает все, что я написал объекту Response
, и отправляет либо информацию об отладке, либо страницу пользовательских ошибок в зависимости от того, как настроено приложение.
Мой вопрос - как я могу подавить это поведение IIS и отправить информацию об ошибке непосредственно из моей реализации IHttpHandler
?
Это приложение представляет собой порт из PHP; клиентская сторона уже написана, поэтому я практически придерживаюсь этой спецификации. Отправка ошибок с кодом состояния 200, к сожалению, не соответствует форме.
В идеале, мне нужно контролировать поведение программно, потому что это часть SDK, который мы хотим распространять, без дополнительных настроек "изменить этот файл" и "изменить эту настройку IIS".
Спасибо!
Изменить: Отсортировано. Context.Response.TrySkipIisCustomErrors = true
был билет. Ничего себе.
Context.Response.TrySkipIisCustomErrors = true
В прошлом я использовал следующее и смог отправить ошибку 503 с помощью специального сообщения, используя код, показанный ниже в методе Page_Load. Я использую эту страницу за балансировщиком нагрузки в качестве страницы ping для балансировки нагрузки, чтобы узнать, работает ли сервер или нет.
Надеюсь, что это поможет.
protected void Page_Load(object sender, System.EventArgs e)
{
if (Common.CheckDatabaseConnection())
{
this.LiteralMachineName.Text = Environment.MachineName;
}
else
{
Response.ClearHeaders();
Response.ClearContent();
Response.Status = "503 ServiceUnavailable";
Response.StatusCode = 503;
Response.StatusDescription= "An error has occurred";
Response.Flush();
throw new HttpException(503,string.Format("An internal error occurred in the Application on {0}",Environment.MachineName));
}
}
Возможно, вы захотите установить страницу customErrors (настраивается через web.config). Вы можете хранить контент в запросах в сеансе (или через альтернативный механизм), а затем настроить asp.net для отображения страницы пользовательских ошибок, которая в свою очередь отображает ваш пользовательский вывод.
Слово осторожности: если 500 вызван из-за фундаментальной проблемы с приложением (т.е. StackOverflowException), и вы пытаетесь отобразить страницу, которая зависит от asp.net(то есть MyCustomErrors.aspx), вы можете закончите в цикле.
Для получения дополнительной информации ознакомьтесь с этой страницей.