Ограничения за дължината на URL адреса на OData

Браузърите имат ограничение за дължината на URL адресите. IE има ограничение дължината на URL адреса да не надвишава 2K знака.

Когато формирам заявка за $filter равно, мога да сравня с множество входни стойности. В такъв случай дължината на Url ще надхвърли 2K.

OData задава ли някакви ограничения за дължината на Url?

Благодаря


person Venki    schedule 22.11.2010    source източник


Отговори (3)


Самият OData не ограничава дължината на Url, но както отбелязахте повечето клиенти и сървъри го правят. Така че обикновено е добра практика да не създавате URL адреси твърде дълги.

Проблемът, който споменавате (имплементиране на оператора Contains или нещо подобно), има две възможни решения:

1) Използвайте операция на услугата, за да се справите с такава заявка вместо вас. Евентуално можете да подадете множеството входни стойности, кодирани като низ или нещо подобно, или може би операцията на услугата така или иначе ги знае предварително.

2) Използвайте дългия $filter, но изпратете заявката в $batch заявка. Предимството е, че лимитът на Url е много по-голям и е много малко вероятно да го достигнете. Недостатъкът е, че въпреки че се опитвате да изпълните GET заявка, поради $batch тя пътува като POST заявка през мрежата и по този начин няма да бъде кеширана.

person Vitek Karas MSFT    schedule 22.11.2010
comment
Те са от стека за извикване от изключение, хвърлено с System.UriFormatException: „Невалиден URI: Схемата на Uri е твърде дълга.“: Както виждате ясно, Odata ограничава uri само защото използва System.Uri и ограничението е зададено в System. Uri.cs като c_MaxUriSchemeName = 1024. ` System.dll!System.Uri.CreateUri System.Web.OData.dll! ` - person ozanmut; 08.08.2018
comment
Имате ли нещо против да актуализирате отговора си въз основа на ситуацията през 2021 г.? - person Maulik Modi; 19.04.2021

Отлагам отговора на @Vitek на въпроса на OP:

Самата OData не ограничава дължината на Url

Но ако други, които пристигат тук поради ограничения на IIS : The request filtering module is configured to deny a request where the query string is too long., може да се възползват от моя отговор. Следвайте инструкциите за тази грешка:

Verify the configuration/system.webServer/security/requestFiltering/requestLimits@maxQueryString setting in the applicationhost.config or web.config file.

Следвайте инструкциите:

<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxQueryString="50000">
        </requestLimits>
        ...

Може да получите и тази грешка: The length of the query string for this request exceeds the configured maxQueryStringLength value.

Тази техника е описана тук и тук , и изглежда така:

<configuration>
    <system.web>
        <httpRuntime maxQueryStringLength = "50000" ... />
person The Red Pea    schedule 18.08.2016

Не открих как се използва $batch. така че използвах $filter за изпращане на дълга заявка. Доста лесно е:

DataServiceQuery<CLIENT> ordersQuery = DataServiceQuery<CLIENT>)this.context.CLIENTS.AddQueryOption("$filter", MyFilter());

където MyFilter() връща низ като този: "ID_CLIENT = 1 or ID_CLIENT = 2"

NB: Не използвайте главни букви И. това води до и грешка. използвай and не AND

person ihebiheb    schedule 20.09.2012
comment
Не виждам как да отговоря на въпроса на OP. Как това е свързано с твърде дългата дължина на URL адреса? - person Jerther; 22.10.2015
comment
Нямам идея. Дори не си спомням да съм писал този отговор - person ihebiheb; 20.06.2019