Веб-API ASP.NET: неописательная внутренняя ошибка сервера 500

Как сказано в заголовке, я получил 500 внутренних ошибок сервера от запроса GET до действия IQueryable. Текст ошибки пуст. Эта ошибка возникает после того, как мое действие вернет результат.

Я использую ASP.NET Web API RC.

Как я могу получить трассировку стека этой ошибки?


person oddy    schedule 08.06.2012    source источник
comment
Берат, как я уже сказал, исключение происходит после, когда мое действие возвращает результат. Я предполагаю, что это происходит, когда Web Api пытается сериализовать мою коллекцию. Но я не хочу предполагать, я хочу точно знать, что происходит.   -  person oddy    schedule 08.06.2012
comment
Я видел это как известную проблему в одной из старых версий. Какую из них вы используете, бета-версию или RC?   -  person Aliostad    schedule 08.06.2012
comment
Aliostar, я думаю, что уже давал эту деталь в своем первоначальном вопросе. Это RC.   -  person oddy    schedule 08.06.2012
comment
У меня такая же проблема при использовании ПДУ. В моем случае это связано с запретом сериализации XML (доказано, к моему удовлетворению, принудительной сериализацией JSON и всем, что работает). Я тоже хотел бы, чтобы при возникновении фактической ошибки всплыло всплывающее окно.   -  person Stever B    schedule 08.06.2012
comment
@ stever-b Я очистил средство форматирования xml в Global.asax. Но в моем случае средство форматирования xml правильно сериализовало сущности. Я мог видеть это с помощью GET из браузера. Использование getJSON из jquery приводит к тому, что средство форматирования JSON было выбрано WebAPI, и, я думаю, именно здесь что-то идет не так.   -  person oddy    schedule 10.06.2012
comment
@ stever-b Но опять же, я не хочу гадать каждый раз, когда что-то идет не так. Все, что я хочу, это получить подробную трассировку стека с сервера, когда что-то пойдет не так.   -  person oddy    schedule 10.06.2012
comment
У меня такая же проблема. Я использую настраиваемый MediaTypeFormatter, и для меня сериализация завершена успешно (я поставил точку останова и увидел, что все объекты правильно сериализованы и записаны в поток ответов). Ошибка где-то после сериализации.   -  person Andris    schedule 18.06.2012
comment
Это ошибка в RC. Невозможно вернуть ошибку (сообщение об исключении) в содержимом ответа при удаленном запросе uri вашего API. Длина содержимого всегда равна нулю. Я попробовал включить как IncludeErrorDetailPolicy, так и переопределить ExceptionFilterAttribute OnException, но он не работал удаленно, несмотря на то, что для ошибок клиентов в web.config было установлено значение Off. Исключение возникло, когда я использовал rdp на удаленном сервере и сделал запрос на локальном хосте, используя только параметр IncludeErrorDetailPolicy. К сожалению, я считаю, что вы еще не можете получить трассировку стека ошибки.   -  person cleftheris    schedule 20.06.2012
comment
Здесь та же ошибка. Вы бы случайно не включили Medium Trust, не так ли?   -  person Sam    schedule 30.07.2012
comment
@Sam Полное доверие. Я работал с ISAPI, который требует повышенных привилегий.   -  person oddy    schedule 30.07.2012
comment
Не появляется ли случайно что-нибудь в журналах событий?   -  person parKing    schedule 17.10.2012
comment
@oddy D: Вы нашли какое-нибудь решение этой проблемы?   -  person sham    schedule 06.04.2017
comment
@sham Да, я перешел на стек технологий Java   -  person oddy    schedule 07.04.2017
comment
Когда я столкнулся с этой ошибкой, меня разочаровал WebApi. Проблема началась, когда я обновил Visual Studio, а также все пакеты Nuget в моем решении. Я просто создал новый ASP Core WebApi (без MVC) в своем решении и перешел с помощью кодов. С тех пор я отлично бегаю.   -  person Olorunfemi Ajibulu    schedule 13.10.2018


Ответы (10)


После RC эта проблема была исправлена, и вы также будете получать подробную информацию об ошибке, помимо 500 Internal Server Error. (Эта проблема исправлена ​​только для сценариев веб-хостинга).

Вы можете сделать следующее, чтобы получить подробную информацию о фактическом исключении, которое могло произойти во время метода WriteToStream форматировщика.

ObjectContent<IEnumerable<Product>> responseContent = new ObjectContent<IEnumerable<Product>>(db.Products.Include(p => p.ProductSubcategory).AsEnumerable(), new XmlMediaTypeFormatter()); // change the formatters accordingly

            MemoryStream ms = new MemoryStream();

            // This line would cause the formatter's WriteToStream method to be invoked.
            // Any exceptions during WriteToStream would be thrown as part of this call
            responseContent.CopyToAsync(ms).Wait();
person Kiran Challa    schedule 12.06.2012
comment
Спасибо. Добавление этого к моему действию, а затем установка точки останова было единственным способом увидеть исключение. Ваше здоровье! - person asgeo1; 05.07.2012
comment
Значит, для selfhost это не исправлено? - person JefClaes; 13.07.2012
comment
Post RC еще не выпущен, верно? Разве что строить из исходников? - person JefClaes; 13.07.2012

Вы можете попробовать добавить:

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = 
    IncludeErrorDetailPolicy.Always;

на ваш Application_Start() в Global.asax. Это решение работает для многих распространенных ошибок.

Однако, если вы не получаете удовлетворительной информации, вам следует подумать о написании фильтра исключений и его глобальной регистрации.

Эта статья должна помочь вам начать работу. Суть того, что вам нужно, - это написать и зарегистрировать что-то вроде:

public class NotImplExceptionFilter : ExceptionFilterAttribute {
  public override void OnException(HttpActionExecutedContext context) {
     if (context.Exception is NotImplementedException) {
       context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
    }
  }
}
person Stever B    schedule 08.06.2012
comment
@EBarr Я уже пробовал это до того, как опубликовал свой вопрос. Я видел здесь ваш ответ stackoverflow. com / questions / 10487943 / Как-то не работает. Моя ошибка 500 все еще имеет пустое тело. Я использовал вкладку «Сеть» в Chrome, чтобы увидеть ответы с сервера. - person oddy; 10.06.2012
comment
@Oddy - Когда вышеперечисленное не помогает, я не нашел отличного способа отладки. Когда ошибка возникает после того, как ваше действие возвращается, я вижу несколько путей - 1) выше, 2) ваш возврат - это IEnumerable, который выполняет ошибочный запрос. Попробуйте .ToList(), чтобы проверить запрос, 3) Отключите или отладьте вторую половину любых обработчиков сообщений (раздел ContinueWith()) или 3) форматирование вывода нарушается (json или xml), поэтому используйте скрипач / что угодно, чтобы запросить альтернативный формат . - person EBarr; 10.06.2012
comment
@SteverB - не знаю, почему кто-то проголосовал против вас. Этот ответ работает во многих сценариях. - person EBarr; 10.06.2012
comment
@EBarr 1. Выше не работает. Если у вас это работает в RC, то это должно быть я сделал что-то выше описанное. Я дважды проверю это через несколько часов. 2. Я возвращаю IQueryable, возможно, вы уже видели эту деталь в моем вопросе. 3. До того, как я выключил программу форматирования xml, xml был правильным. В конце концов, я обнаружил проблему, когда подключил JSON.NET в качестве средства форматирования вместо сериализатора DataContract по умолчанию. Но, как я уже сказал ранее, меня это не интересует. Мне нужны подробные сведения об ошибках сервера, когда они возникают. - person oddy; 11.06.2012
comment
@EBarr Я опроверг этот ответ. Это работает для некоторых людей на SO. Но я не видел версии фреймворка. MVC 4 RC отличается от Beta. Веб-API был изменен. Когда у меня это сработает, я его поддержу и помечу как ответ. В противном случае, если это не сработает, этот ответ запутает тех, у кого точно такая же проблема. - person oddy; 11.06.2012
comment
Описание в вашем вопросе довольно общее и охватывает множество возможных сценариев. Пользователи SO - довольно умная группа - я думаю, что это дает им возможность исследовать и не смущает их. - person EBarr; 12.06.2012
comment
У меня точно такая же проблема; Я пробовал настраиваемый фильтр исключений, глобальную конфигурацию и т. Д. Это происходит в конце конвейера после всех событий. Просто сервер 500 больше ничего. Даже переместил сайт на IIS 7.5 и включил трассировку IIS - все, что нужно было сделать, это подтвердить 500, ничего больше, никакого стека, ничего, чтобы сообщить мне об ошибке. 100% воспроизведение в небольшом растворе. - person Shawn Cicoria; 12.06.2012
comment
@EBarr, мое описание проблемы краткое и по существу. Как видите, никто не просил дополнять его подробностями. И я все еще не могу получить подробную информацию об ошибке сервера 500, возвращаемой сервером с использованием вышеупомянутого подхода. - person oddy; 13.06.2012
comment
@diaho А вы используете RC-версию? - person oddy; 22.06.2012

Я столкнулся с этой же проблемой. Я нашел ответ Кирана Чаллы полезным в получении фактического исключения, возникающего вне моего действия.

Чтобы решить мою проблему, установив ProxyCreationEnabled для свойства моего контекста значение false позволило мне сделать еще один шаг вперед.

В моем сценарии следующее исключение было связано с циклической ссылкой в ​​моих моделях. После очистки фантомный 500 отклик пропал. Удачи, если вы еще не решили эту проблему!

person Blocka    schedule 03.07.2012

Обманчиво простая слабость маршрутизации вызвала эту проблему в моем случае: в моем контроллере Api был еще один HttpPost с той же подписью (не именем). Маршрутизация по умолчанию не разрешила различия имен, и ServiceError 500 был ответом, который он дал до того, как была достигнута какая-либо из функций Api. Решение: измените маршрутизацию по умолчанию или ваши подписи и попробуйте еще раз.

Вот мой RouteConfig.cs, который вполне подходит для стандартного использования WebApi2:

    public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // Default is required in any case.
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}
person GGleGrand    schedule 18.12.2015
comment
Это кажется безумным, я подумал, что его нужно просто забрать из коробки. Не уверен, что когда-нибудь нашел бы это. Это должно быть настоящей болью для любого, у кого есть много методов, которые передают один объект JSON и т. Д. - person Neil P; 06.06.2017
comment
Предположим, что это, возможно, функция, а не ошибка ... она тоже свела нас с ума :-) ... или будет исправлена ​​в WebApi3. - person GGleGrand; 12.06.2017

Это может быть связано с циркулярной ссылкой.

http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#handling_circular_object_references.

Попробуйте добавить следующий код в метод Application_Start в файле Global.asax:

 var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
 json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
person Simcha Khabinsky    schedule 17.01.2014

У меня возникла проблема в RC, когда я не указывал параметры запроса в правильном порядке. Например, если вы укажете $skip=0, будет получено 500, но если вы укажете $orderby=xxx&skip=0, ошибки не будет.

person Jimzy    schedule 19.06.2012

Этот сценарий возник по следующим причинам

  1. Проблема возникла из-за неверного формата Web.config. (Несколько разделов конфигурации)

  2. Вместо того, чтобы создавать папку roslyn внутри папки bin, я создал ее в корне. (Место развертывания.)

Лучший способ диагностировать это - поместить простую HTML-страницу в местоположение приложения и попытаться просмотреть ее. 500 Описание ошибки будет отображаться на этой html-странице.

А также не забудьте добавить

<customErrors mode="Off"></customErrors>

в Web.config

person sham    schedule 07.04.2017

Я обычно использую Global.asax, чтобы отловить все ошибки. Вот фрагмент кода, который вы можете использовать

public void Application_Error(object sender, EventArgs e)
{
  Exception exc = Server.GetLastError();
  MvcApplication mvcApplication = sender as MvcApplication;
  HttpRequest request = null;
  if (mvcApplication != null) request = mvcApplication.Request;
}
person Anders    schedule 13.10.2012

У меня была та же проблема, но ее источник был немного другим: я неправильно установил политику CORS, и это дает мне 500 Internal server error, но поскольку CORS не работал, заголовок Access-Control-Allow-Origin не был представлен в ответ, и браузер не может прочитать фактический отклик

Я решил это с помощью параметра ChromeDevTools Copy as cURL, который позволяет мне видеть ответ и понимать источник ошибки.

person Saito    schedule 20.05.2016

Фредрик Нормен написал отличное сообщение в блоге под названием Обработка исключений веб-API ASP.NET по этой теме. В его решении используются настраиваемые классы исключений и атрибут фильтра исключений, который может применяться ко всем ApiController методам действий.

person Marius Schulz    schedule 22.06.2012