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


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

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

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

10 66

10 ответов:

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

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

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

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = 
    IncludeErrorDetailPolicy.Always;

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

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

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

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

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

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

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

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

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;

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

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

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

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

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

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

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

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

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

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

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

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

в web.конфигурации