2016-10-04 1 views
0

Я разрабатываю веб-службу RESTful с использованием Web API 2 и OWIN. Первоначально мои контроллеры унаследованы от ApiController, а действия GET поддерживают фильтрацию/запросы OData, то есть отмеченные [EnableQuery].

Теперь мы решили посмотреть, возможно ли предоставить реальный сервис OData, и поэтому наши наборы контроллеров наследуют от ODataController вместо ApiController. Хотя это, похоже, работает хорошо по большей части, $ select больше не работает.

public class BaseController : ODataController 
{ 
    ... some properties here, not related to issue... 
} 


public class EmployeesController : BaseController 
{ 
    private readonly AppDbContext _context = new AppDbContext(); 

    [EnableQuery] 
    public IQueryable<Employee> Get() 
    { 
     return _context.Employees; 
    } 
    ... 
} 

Ошибка Я вижу это:

{ 
    "error": { 
    "code": "", 
    "message": "An error has occurred.", 
    "innererror": { 
     "message": "'DbQuery`1' cannot be serialized using the ODataMediaTypeFormatter.", 
     "type": "System.Runtime.Serialization.SerializationException", 
     "stacktrace": " at System.Web.OData.Formatter.ODataMediaTypeFormatter.GetSerializer(Type type, Object value, ODataSerializerProvider serializerProvider)\r\n at System.Web.OData.Formatter.ODataMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content, HttpContentHeaders contentHeaders)\r\n at System.Web.OData.Formatter.ODataMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Owin.HttpMessageHandlerAdapter.<BufferResponseContentAsync>d__13.MoveNext()" 
    } 
    } 
} 

Я озадачен, как это работает с ApiController, но не с ODataController! Есть что-то, что мне не хватает?

Cheers!

+0

Вы запрашиваете его в формате XML? Набранные объекты IIRC не любят «$ selects» при десериализации. Попробуйте приложение/json, чтобы убедиться, что это проблема. –

+0

Спасибо @MarvinSmit - я добавил заголовок «Принять: приложение/json», когда я делаю запрос в Postman, но я все равно получаю ту же ошибку – Scottie

ответ

0

Хорошо, я понял, что происходит:

Я пытался обновить свои OData пакеты до последней версии для OData v4 поддержки. Пространства имен библиотек Microsoft .Net OData были изменены между OData v3 (System.Web.Http.OData) и v4 (System.Web.OData). Мне удалось каким-то образом смешать эти библиотеки таким образом, что я ссылался на атрибут EnableQuery в старой библиотеке OData, что вызвало проблему с сериализацией.

Непонятная проблема для отслеживания - неясно, что происходит, когда атрибуты имеют одно и то же имя, но находятся в разных пространствах имен и фактически принадлежат совершенно другим версиям!

 Смежные вопросы

  • Нет связанных вопросов^_^