Как отправить код состояния 500 в ASP.Net и все еще написать ответ?

У меня есть однофайловая веб-служба 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 был билет. Ничего себе.

Ответ 1

Context.Response.TrySkipIisCustomErrors = true

Ответ 2

В прошлом я использовал следующее и смог отправить ошибку 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));  
        }
    }

Ответ 3

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

Слово осторожности: если 500 вызван из-за фундаментальной проблемы с приложением (т.е. StackOverflowException), и вы пытаетесь отобразить страницу, которая зависит от asp.net(то есть MyCustomErrors.aspx), вы можете закончите в цикле.

Для получения дополнительной информации ознакомьтесь с этой страницей.