Limitações de comprimento do URL odata
-
27-09-2019 - |
Pergunta
Os navegadores têm limitação no comprimento dos URLs. O IE tem limitação de que o comprimento da URL não deve exceder os caracteres 2K.
Quando formar um filtro $ é igual à consulta, eu poderia comparar com vários valores de entrada. Nesse caso, o comprimento do URL excederia 2k.
Odata define algum limite para o comprimento do URL?
Obrigado
Solução
O próprio Odata não limita o comprimento do URL, mas como você observou a maioria dos clientes e servidores. Então, geralmente é uma boa prática não produzir URLs por muito tempo.
O problema que você se refere (implementando o operador contém ou algo semelhante) tem duas soluções alternativas possíveis:
1) Use a operação de serviço para lidar com essa consulta para você. Você pode passar os múltiplos valores de entrada codificados como uma string ou algo assim, ou talvez a operação de serviço os conheça de qualquer maneira.
2) Use o filtro $ longo, mas envie a solicitação em uma solicitação de lote $. A vantagem é que o limite do URL é muito maior e é muito improvável que você o atinja. A desvantagem é que, embora você esteja tentando executar uma solicitação GET, devido ao $ lote, ele viaja como solicitação de postagem pela Web e, portanto, não será armazenado em cache.
Outras dicas
Eu adiar para @Resposta de vitek para a pergunta do OP:
O próprio Odata não limita o comprimento do URL
Mas se outros que chegam aqui por causa de IIS Limitações : The request filtering module is configured to deny a request where the query string is too long.
, eles podem se beneficiar da minha resposta. Siga as instruções desse erro:
Verify the configuration/system.webServer/security/requestFiltering/requestLimits@maxQueryString setting in the applicationhost.config or web.config file.
Siga as instruções:
<configuration>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxQueryString="50000">
</requestLimits>
...
Você também pode receber este erro:The length of the query string for this request exceeds the configured maxQueryStringLength value.
Esta técnica é descrita aqui e aqui, e parece assim:
<configuration>
<system.web>
<httpRuntime maxQueryStringLength = "50000" ... />
Eu não encontrei como o $batch
é usado. Então eu usei $filter
para enviar um longo pedido. É bem fácil:
DataServiceQuery<CLIENT> ordersQuery = DataServiceQuery<CLIENT>)this.context.CLIENTS.AddQueryOption("$filter", MyFilter());
Onde MyFilter()
Retorne uma string como esta: "ID_CLIENT = 1 or ID_CLIENT = 2"
NB: Não use a mancha e. leva a e erro. usar and
não AND