2012-06-08 4 views
64

Как говорится в заголовке, у меня есть 500 Internal Server Error из запроса GET для действия IQueryable. Тело ошибки пуст. Эта ошибка возникает после того, как мое действие возвращает результат.ASP.NET Web API: не описательная ошибка внутреннего сервера

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

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

+0

использовать точки останова –

+2

Берата, как я сказал, исключение происходит ли ** после * * мое действие возвращает результат. Я предполагаю, что это происходит, когда Web Api пытается сериализовать мою коллекцию. Но я не хочу предполагать, я хочу точно знать, что происходит. – oddy

+0

Я видел это как известную проблему в одной из старых версий. Какой из них вы используете, бета или RC? – Aliostad

ответ

8

Сообщение RC, эта проблема была решена, и вы будете получать сведения об ошибках и кроме внутренней ошибки 500 Server. (Эта проблема исправлена ​​только для сценариев веб-хоста).

Для получения информации о фактическом исключении, которое может возникнуть во время метода 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(); 
+0

Спасибо. Добавление этого к моему действию, а затем установка точки останова было единственным способом увидеть исключение. Ура! – asgeo1

+1

Значит, это не исправлено для самообороны? – JefClaes

+2

Сообщение RC еще не выпущено? Разве вы не строите из источников? – JefClaes

52

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

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = 
    IncludeErrorDetailPolicy.Always; 

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

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

This article должно начаться. Суть того, что вам нужно, чтобы написать & регистр что-то вроде:

public class NotImplExceptionFilter : ExceptionFilterAttribute { 
    public override void OnException(HttpActionExecutedContext context) { 
    if (context.Exception is NotImplementedException) { 
     context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented); 
    } 
    } 
} 
+1

@EBarr Я уже пробовал это, прежде чем отправил свой вопрос. Я видел ваш ответ здесь http://stackoverflow.com/questions/10487943/mvc4-wepapi-empty-response-when-non-200 Это не работает. Моя ошибка 500 все еще имеет пустое тело. Я использовал вкладку «Сеть» в Chrome, чтобы увидеть ответы с сервера. – oddy

+0

@Oddy - Когда выше не удается, я не нашел отличный способ отладки. Когда ошибка происходит после того, как ваше действие возвращается, я вижу несколько проспектов - 1) выше, 2) ваше возвращение - это IEnumerable, который выполняет запрос об ошибке. Попробуйте '.ToList()' проверить запрос, 3) Отключите или отлаживайте вторую половину всех обработчиков сообщений (раздел 'ContinueWith()') или 3) форматирование вывода ломается (json или xml), поэтому используйте fiddler/любой, чтобы попросить альтернативный формат. – EBarr

+1

@SteverB - не уверен, почему кто-то отказал вам. Этот ответ работает во многих сценариях. – EBarr

1

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

+1

Пожалуйста, снова прочитайте вопрос. Спасибо. – oddy

0

Fredrik Normén написал замечательное сообщение в блоге под названием ASP.NET Web API Exception Handling по этой теме. В его решении используются специальные классы исключений и атрибут фильтра исключения, который может применяться ко всем методам действий ApiController.

4

Я столкнулся с этой проблемой. Я нашел Kiran Challa's response полезной для того, чтобы исключить фактическое исключение вне моего действия.

Чтобы решить мою проблему, setting the ProxyCreationEnabled property of my context to false сделал еще один шаг.

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

+0

+1. У меня были такие же проблемы, как и вы - это сработало для меня. – asgeo1

+1

+1 для круговой ссылки.Спасибо – Askolein

1

Обычно я использую 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; 
} 
3

Это может быть ссылка на круговую ссылку.

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; 
3

обманчиво простая слабость маршрутизации вызвало эту проблему в моем случае: Был еще один HttpPost с той же подписью (не имя) в моем Api Controller. Маршрутизация по умолчанию не разрешала различия имен, и 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 } 
     ); 
    } 
} 
+0

Это кажется безумным, я подумал, что он должен просто подняться из коробки. Я не уверен, что когда-нибудь найду это. Это должно быть настоящей болью для тех, у кого много методов, которые передают один объект JSON и т. Д. –

+0

Предположим, что это, возможно, функция, а не ошибка ... она тоже заставила нас гадать :-) ... или будет исправлена ​​в WebApi3 , – GGleGrand

0

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

Я решил ее с опцией Copy as cURL ChromeDevTools, который позволяет мне С.Е. е ответ и понять источник ошибки

0

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

  1. проблема возникла из-за Деформированные Web.config. (Несколько configSections)

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

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

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

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

в Web.config

Смежные вопросы