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


у меня есть ASP.Net однофайловый веб-сервис (a содержащий IHttpHandler реализация), который должен быть в состоянии возвращать ошибки в качестве ответов с 500 Внутренняя Ошибка Сервера коды состояния. Это относительно простая вещь, чтобы сделать в PHP:

header("HTTP/1.1 500 Internal Server Error");
header("Content-Type: text/plain");
echo "Unable to connect to database on $dbHost";

ASP.Net (C#) эквивалент должен быть:

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" дополнительные инструкции.

спасибо!

Edit: Сортировать. Context.Response.TrySkipIisCustomErrors = true был билет. Круто.

3 63

3 ответа:

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 (настраивается через интернет.конфигурация.) Вы можете хранить свой контент через запросы в сеансе (или через альтернативный механизм), а затем иметь asp.net настроено для отображения пользовательской страницы ошибок, которая в свою очередь отображает ваш пользовательский вывод.

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

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