Определить версию сервера OData

Учитывая известную конечную точку OData, какой лучший способ определить версию службы OData? Клиент в этом сценарии может поддерживать любую версию (1-4), но мне нужно знать, как отформатировать запрос.

Например, OData-Version возвращает "4.0" для службы V4, но служба V3 даже не имеет этого заголовка.

Кроме того, запрос корневого URL-адреса службы может быть довольно дорогостоящим для службы с большим количеством объектов. Для примера базовая служба Dynamics 2016 Online без каких-либо настраиваемых объектов возвращает 2.7 Кбайт данных, когда все, что мне действительно нужно, это заголовок версии.

Так что же самое легкое решение для получения надежного номера версии? Это нормально, если решение "проверьте это или, если оно отсутствует, тогда проверьте это". Что означает "this" и "that"?


Я нашел один вопрос (Как найти версию OData из метаданных), который, как мне кажется, частично отчасти отчасти, но есть некоторые проблемы с ответом.

Во-первых, он сосредоточился на поиске номеров мин/макс, где я бы предпочел максимум.

Во-вторых, для этого требуется запросить метаданные, но это потенциально массивная загрузка. /$metadata в Dynamics CRM 2016 Online дает ответ на 3,7 МБ (для загрузки моего текущего подключения требуется 30 секунд). Я подумал о том, чтобы запросить фиктивный объект, например /dummy__entity, а затем изучить заголовки, но для меня это немного похоже, потому что он излишне запускает ведение журнала ошибок на сервере, и я не уверен, что ответ на ошибку всегда будет есть заголовки, которые я ищу.

Ответ 1

OData 1.0/2.0/3.0

В соответствии с MS-ODATA 1.7 Версии и возможности:

Протокол OData, определенный в этом документе, позволяет ограничить согласование возможностей с помощью заголовков ответов DataServiceVersion (раздел 2.2.5.3) и MaxDataServiceVersion (раздел 2.2.5.7) и заголовка ответа DataServiceVersion (раздел 2.2.5.3).

Когда он говорит "ограниченный", это означает ограниченный:

В ответ от сервера клиенту указан заголовок DataServiceVersion (раздел 2.2.5.3). Значение указывает версию протокола, которую сервер использовал в запросе для генерации ответа и который используется клиентом, чтобы определить, может ли он правильно интерпретировать ответ (то есть значение не является больше, чем значение заголовка MaxDataServiceVersion (раздел 2.2.5.7), отправленного в связанном запросе). Значение заголовка - это самая низкая версия протокола, который сервер может использовать для выполнения запроса.

Итак, в основном, совместимая служба, способная обрабатывать версии OData с 1.0 по 3.0, вернет "1.0" для функций, определенных OData 1.0, "2.0" для функций, определенных OData 2.0 и не присутствующих в OData 1.0 и т.д.

OData 4.0

В соответствии с Версия OData 4.0 Часть 1: Протокол, раздел 8.1.5 OData-версия заголовка

Службы OData ДОЛЖНЫ включать заголовок OData-Version в ответе , чтобы указать версию протокола, используемого для генерации ответа. Клиент ДОЛЖЕН интерпретировать ответ в соответствии с правилами, определенными в указанной версии протокола.

В соответствии с Что нового в OData версии 4.0, раздел 2.1.1 Улучшено: версия протокола

Теперь службы отвечают с помощью протокола максимум, поддерживаемого сервером, и указываются приемлемыми для клиента.

Также "понижение" до версий до 4.0 не распространяется, а издателям служб рекомендуется использовать новые корневые URL-адреса службы для служб 4.0.

Итак, для будущих версий OData, начиная с 4.0, кажется, что я могу надежно получить максимальную версию, которую я искал.

Заключение

Нет очевидного способа получить максимальную версию OData, поддерживаемую службой до 4.0. Заголовок ответа DataServiceVersion будет содержать наименьший возможный номер версии на основе имеющихся функций URL-адреса, версию OData, поддерживаемой службой, и запрошенную клиентом версию.

Однако, начиная с OData 4.0, заголовок ответа OData-Version всегда будет содержать максимальную версию на основе того, что поддерживает служба, и того, что запросил клиент.

К сожалению, в каждом экземпляре, который я пробовал до сих пор, передача заголовка "DataServiceVersion" в службу OData 4.0 приводит к ответу "Внутренняя ошибка сервера 500" (без заголовка OData-Version). Таким образом, кажется, что отправка заголовков OData-Version и DataServiceVersion не гарантируется.

Лучшая ставка, кажется, отправляет OData-Version, а затем ищет заголовок ответа DataServiceVersion (который, вероятно, будет "1.0" даже для службы, поддерживающей 3.0). Если этот заголовок присутствует в ответе, отправьте второй запрос с заголовком DataServiceVersion "3.0". Если вы получите ответ 4xx, попробуйте "2.0" и т.д.