ASP.NET Web API: не описательная 500 Внутренняя ошибка сервера
Как говорится в заголовке, у меня есть 500 внутренних ошибок сервера от запроса GET до действия IQueryable. Тело ошибки пустое. Эта ошибка происходит после того, как мое действие возвращает результат.
Я использую ASP.NET Web API RC.
Как я могу получить трассировку стека ошибки?
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 ответ пропал. Удачи, если вы еще не решили эту еще бы!
Это может быть связано с циклической ссылкой.
попробуйте добавить следующий код в метод 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
методы действий.
этот сценарий был вызван по следующим причинам
проблема возникла из-за неверно сформированной сети.конфиг. (Несколько конфигураций)
вместо создания Рослин внутри bin Папка, я создал ее в корне. (Место развертывания.)
лучший способ диагностировать это было, чтобы поставить простую HTML-страницу в месте приложения и попытаться просмотреть его. Пятьсот Описание ошибки будет отображаться на этой странице html.
а также не забудьте добавить
<customErrors mode="Off"></customErrors>
в web.конфигурации