Ограничения длины URL-адреса OData

Браузеры имеют ограничения на длину URL-адресов. В IE есть ограничение: длина URL-адреса не должна превышать 2 КБ символов.

Когда я формирую запрос $filter equals, я могу сравнить несколько входных значений. В таком случае длина URL превысит 2 КБ.

Устанавливает ли OData какие-либо ограничения на длину URL-адреса?

Спасибо


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


Ответы (3)


Сам OData не ограничивает длину URL-адреса, но, как вы заметили, это делают большинство клиентов и серверов. Поэтому обычно рекомендуется не создавать слишком длинные URL-адреса.

Проблема, на которую вы ссылаетесь (реализация оператора Contains или что-то подобное), имеет два возможных обходных пути:

1) Используйте сервисную операцию для обработки такого запроса. Возможно, вы можете передать несколько входных значений, закодированных как строка или что-то в этом роде, или, возможно, операция службы все равно знает их заранее.

2) Используйте длинный фильтр $, но отправьте запрос в пакетном запросе $. Преимущество в том, что ограничение на URL-адрес намного больше, и очень маловероятно, что вы его достигнете. Недостатком является то, что даже если вы пытаетесь выполнить запрос GET, из-за пакета $ он отправляется как запрос POST через Интернет и, следовательно, не будет кэшироваться.

person Vitek Karas MSFT    schedule 22.11.2010
comment
Это из стека вызовов из исключения, созданного с помощью System.UriFormatException: «Недопустимый URI: схема Uri слишком длинная». Как вы видите, Odata ограничивает uri только потому, что использует System.Uri, а ограничение установлено в System. Uri.cs as 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 на вопрос ОП:

Сам 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, а не AND

person ihebiheb    schedule 20.09.2012
comment
Я не понимаю, как ответить на вопрос ОП. Как это связано со слишком большой длиной URL? - person Jerther; 22.10.2015
comment
Не имею представления. Я даже не помню, чтобы писал этот ответ - person ihebiheb; 20.06.2019