Отладка сервисов ADO.NET Data Services

Интерес к платформе ADO.NET Data Services растет среди разработчиков веб-сервисов. Это также подтверждается и тем, что я все чаще получаю письма с вопросами о той или иной проблеме. Как правило эти вопросы сводятся к тому, что после выполнения определенной последовательности действий сервис начинает выдавать невнятную ошибку и предлагает ознакомится с деталями в логах.

Знакомо ли вам данное сообщение? Если вы уже испытывали ADO.NET Data Services и пытались что-то сделать, то думаю что да.

Причина всех недоумений заключается в том, что в действительности по умолчанию ADO.NET Data Services не пишет никаких сообщений в логи, а если вам это необходимо, то вы должны позаботится об этом сами. Что же делать если хочется понять в чем истинная ошибка?

Достаточно обратиться к статическому методу инициализации сервиса InitializeService, параметром которого является объект-наследник IDataServiceConfiguration. Последний имеет в своем составе свойство UseVerboseErrors. Для получения внятного описания ошибки необходимо установить это свойство в true.

public static void InitializeService(IDataServiceConfiguration config)
{
    config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
    config.UseVerboseErrors = true;
}

Теперь снова обратимся к сервису и увидим описание ошибки.

Здесь мы уже можем увидеть какие-то детали и даже Stack Trace. Часто этого бывает достаточно. Однако, в определенных ситуациях до сих пор не удается понять в чем дело. После несложных операций в рефлекторе можно понять, что вся инфраструктура построена поверх Windows Communication Foundation, а конкретно WCF REST API. Как известно, в целях безопасности WCF по умолчанию скрывает детали исключения. Тем не менее, мы можем переопределить это поведение, явно указав WCF что необходимо делать в этом случае. В нашем случае сделать это проще всего используя атрибут SerivceBehavior.

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class WebDataService1 : DataService<MvcMiniCmsEntities>
{
    //...

Теперь WCF будет включать детали исключения в ответ и можно понять что происходит в каждом конкретном случае.