Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Опубликовать 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 WriteToStream method to be invoked.
            // Any exceptions during WriteToStream would be thrown as part of this call
            responseContent.CopyToAsync(ms).Wait();

Ответ 2

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

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = 
    IncludeErrorDetailPolicy.Always;

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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;

Ответ 5

Обманчиво простая слабость маршрутизации вызвала эту проблему в моем случае: в моем Api Controller была еще одна 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 }
        );
    }
}

Ответ 6

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

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

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

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

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

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

в Web.config