Ошибка 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.

http://odata.github.io/WebApi/10-01-debug-webapi-source/

Трудно сказать точно, в чем причина этой проблемы, но вот пара вещей, которые вы можете попробовать. Надеемся, что один из них даст вам больше информации о вашем исключении.

Отладка всего кода
Это может показаться очевидным, но убедитесь, что вы не отлаживаете только свой код. Вы можете проверить это, открыв опции отладки в меню "Отладка -> Параметры и настройки...". Убедитесь, что параметр "Включить только мой код" не отмечен. Обычно это может быть хорошо. Когда есть ошибки с исключениями, и вы, кажется, не можете их найти, иногда этот параметр может сбить вас с толку

Отладка исключений
Еще одна вещь, которая может быть одновременно и полезной, и болезненной, - это настройки Debug -> Exceptions.... Это наборы исключений, которые можно настроить так, чтобы Visual Studio автоматически ломался, позволяя вам видеть их движущиеся части. Для отладки MVC и.NET в целом вы бы хотели включить исключение Common Runtime Exception.

С включенными отладочными исключениями вы, вероятно, получите массу исключений, которые вам не нужны. Просто игнорируйте их и продолжайте работать, пока не получите исключения, относящиеся к oData.

Другие вопросы по тегам