Как отправить код состояния 500 в ASP.Net и все же написать в ответ? - PullRequest
64 голосов
/ 21 декабря 2010

У меня есть однофайловый веб-сервис ASP.Net (файл .ashx, содержащий реализацию 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, которую мы хотим распространять без какого-либо " edit thisfile"и" изменить эту настройку IIS"дополнительные инструкции.

Спасибо!

Edit : отсортировано.Context.Response.TrySkipIisCustomErrors = true был билет.Ничего себе.

Ответы [ 3 ]

105 голосов
/ 22 декабря 2010

Context.Response.TrySkipIisCustomErrors = true

10 голосов
/ 21 декабря 2010

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

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

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

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

...