Я разрабатываю веб-службу 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!
Вы запрашиваете его в формате XML? Набранные объекты IIRC не любят «$ selects» при десериализации. Попробуйте приложение/json, чтобы убедиться, что это проблема. –
Спасибо @MarvinSmit - я добавил заголовок «Принять: приложение/json», когда я делаю запрос в Postman, но я все равно получаю ту же ошибку – Scottie