Ошибка ODataController после возврата
У меня есть служба OData, которая реализована с несколькими контроллерами MVC, используя ODataController. У меня проблема со всеми контроллерами, кроме одного, где внутренняя ошибка 500 возвращается без всякой помощи после моего оператора return:
/// <summary><see cref="ODataController" /> reacting to queries relating to <see cref="Contract" /></summary>
[CustomExceptionFilter]
public class ContractsController : ODataController
{
// GET: odata/Contracts
[EnableQuery]
public IQueryable<Contract> GetContracts()
{
return DataAccess.GetContracts();
}
... other methods
}
/// <summary>Single point of reference to access data</summary>
public static class DataAccess
{
/// <summary>Gets the queryable collection of <see cref="ContractCoverageDetail" /></summary>
/// <returns>The queryable collection of <see cref="ContractCoverageDetail" /></returns>
public static IQueryable<Contract> GetContracts()
{
IQueryable<Contract> results = null;
using (EntityFrameworkContext context = new EntityFrameworkContext())
results = context.Contracts.ToArray().AsQueryable();
return results;
}
}
Другой контроллер, использующий тот же класс DataAccess, возвращает данные просто отлично. Все, что возвращается для каждого другого контроллера:
<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<m:code/>
<m:message xml:lang="en-US">An error has occurred.</m:message>
</m:error>
Кажется, ошибка возникает после моего оператора возврата, и если я перехожу после возврата (F10), я нажимаю на каждого человека { get; } свойство возвращаемого объекта коллекции, после чего результат с вышеуказанной ошибкой возвращается в браузер. Я не могу получить актуальную информацию об ошибке (innererror), чтобы появиться на всю жизнь, и странно, что один контроллер работает, а остальные отказывают без каких-либо подробностей.
У кого-нибудь есть идея о том, что может быть причиной этого, или как включить детализацию ошибки после оператора return?
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
в global.asax.cs не помогает, равно как и в web.config:
<system.web>
<customErrors allowNestedErrors="true" mode="On" />
</system.web>
<system.webServer>
<httpErrors existingResponse="PassThrough" />
</system.webServer>
Любая идея, как я могу добраться до фактического возбуждаемого исключения?
2 ответа
Вот простое руководство по отладке OData Web API и библиотеки ODL.
Трудно сказать точно, в чем причина этой проблемы, но вот пара вещей, которые вы можете попробовать. Надеемся, что один из них даст вам больше информации о вашем исключении.
Отладка всего кода
Это может показаться очевидным, но убедитесь, что вы не отлаживаете только свой код. Вы можете проверить это, открыв опции отладки в меню "Отладка -> Параметры и настройки...". Убедитесь, что параметр "Включить только мой код" не отмечен. Обычно это может быть хорошо. Когда есть ошибки с исключениями, и вы, кажется, не можете их найти, иногда этот параметр может сбить вас с толку
Отладка исключений
Еще одна вещь, которая может быть одновременно и полезной, и болезненной, - это настройки Debug -> Exceptions.... Это наборы исключений, которые можно настроить так, чтобы Visual Studio автоматически ломался, позволяя вам видеть их движущиеся части. Для отладки MVC и.NET в целом вы бы хотели включить исключение Common Runtime Exception.
С включенными отладочными исключениями вы, вероятно, получите массу исключений, которые вам не нужны. Просто игнорируйте их и продолжайте работать, пока не получите исключения, относящиеся к oData.