ASP.NET Web API: не описательная ошибка внутреннего сервера 500
Как говорится в заголовке, Ive получил 500 Internal Server Error из запроса GET для действия IQueryable. Тело ошибки пуст. Эта ошибка возникает после того, как мое действие возвращает результат.
Я использую ASP.NET Web API RC.
Как я могу получить трассировку стека этой ошибки?
Ответы
Ответ 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