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