Параметр системного запроса OData $format вызывает неверный запрос 400

У меня есть очень простой образец OData на основе отражения, который работает нормально и генерирует json, когда я использую заголовок Accept, как указано. Однако я не могу заставить его работать с параметром $format=json. Всякий раз, когда я добавляю этот параметр, я получаю Bad Request. В соответствии с этим кажется, что это должно работать: текст ссылки

Обратите внимание, что другие параметры системного запроса, такие как $select, работают нормально. Это .Net 4, работающий через VS2010.


person Clark Updike    schedule 30.08.2010    source источник
comment
Это хороший вопрос. Документация MSDN вводит в заблуждение, поскольку показывает параметр $format как допустимый параметр, но преднамеренно не позволяет запрашивать данные в формате JSON прямо из коробки. Насколько я знаю, это поддерживалось в версии 3.5.   -  person David Hoerster    schedule 31.08.2010


Ответы (2)


Использование $format=json из коробки для службы данных .NET 4 WCF не будет работать, даже если в спецификации OData указано, что она поддерживается. Я точно не знаю, почему Microsoft не поддерживает его напрямую. Но в этой ситуации есть два обходных пути: один кажется немного хакерским, а другой имеет некоторый смысл.

Во-первых, решение, которое кажется немного хакерским, состоит в том, чтобы создать HttpHandler, который перехватывает ваш запрос, считывает параметр строки запроса $format=json, а затем добавляет к вашему запросу заголовок accepts (при удалении вызывающего нарушение параметра $format=json). Это описано в эта запись в блоге.

Второе решение, которое звучит немного лучше, состоит в том, чтобы украсить вашу службу данных атрибутом [JSONPSupportBehavior]. Это имеет немного больше смысла и немного проще в реализации (поскольку вам не нужно создавать HttpHandler). Вот несколько полезных ссылок:

  • запись в блоге с описанием того, как ее использовать.
  • Ссылка для загрузки исходного кода [JSONPSupportBehavior] (да, вам придется его создать — я не нашел скомпилированного файла для скачивания).

Мне нравится подход с атрибутами, я просто хочу, чтобы это не была загрузка с CodePlex ... просто пока это не поддерживается. Но это только мое мнение.

Честно говоря, если у вас есть контроль, лучший подход — просто добавить заголовок accepts к вашему запросу application/json, и ваш сервис автоматически вернет результаты в формате JSON.

Надеюсь, это поможет.

person David Hoerster    schedule 31.08.2010
comment
Спасибо за ссылки - я гуглил это до смерти и так и не нашел их. Я не знал, что формат $ был зарезервирован, что объясняет 400. Я пропустил настройку, которая показала бы мне эти ошибки? - person Clark Updike; 31.08.2010
comment
Еще одна вещь, которую я пробовал, - это переопределить OnStartProcessingRequest в моей службе и выполнить WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json, когда я обнаружил пользовательский параметр &format=json, но это не имело никакого эффекта. - person Clark Updike; 31.08.2010
comment
JSONPSupportBehavior выглядит хорошо — немного больше кода, чем хотелось бы, но он выглядит как полезный инструмент, который нужно знать, как использовать. - person Clark Updike; 31.08.2010
comment
Я вижу ошибку в Google Chrome — я действительно не проверял сообщение об ошибке в IE или FF. Может быть, включить customErrors mode=Off в свой web.config? Или запустите его через Fiddler, и вы должны увидеть сообщение об ошибке. Рад, что это помогает! - person David Hoerster; 31.08.2010
comment
Очень полезно, спасибо, сэр :) - person Mahmoud Farahat; 27.03.2012

Любой, кто сталкивается с этим... Теперь вы можете использовать WCF Data Services Toolkit и наследовать от ODataService, а не от DataService, чтобы автоматически включить эту функцию.

person LMK    schedule 23.04.2013