solicitação excede o maxQueryStringLength configurado ao usar [Autorizar]

121

insira a descrição da imagem aqui
Eu tenho um site MVC3 em C #, tenho uma exibição específica sendo alimentada com parâmetros de consulta de uma função JavaScript, a função redireciona para o site via

window.location.href = "../ActionName?" + query_string;

query_string, sendo a sequência de parâmetros de consulta dinâmica criada pela função JavaScript.

A razão para essa estranheza é que, às vezes, a mesma função passa a URL para um formulário da Web do ASP.Net, devido ao uso do controle reportviewer , a ação alternativa é salvar alguns parâmetros, neste caso, passa para a exibição. (Pode elaborar mais se isso não fizer sentido)

A coisa toda funciona bem até eu apresentar [Autorizar] ao método de ação. Quebra se estiver no lugar, funciona bem sem e [Autorizar] funciona bem em todos os outros métodos.

A URL inteira, neste caso, tem 966 caracteres, depois de pesquisas, parece que o valor maxQueryStringLength é 2048 por padrão, mas pode ser substituído por qualquer valor do tipo número inteiro; portanto, apenas por sorrisos, adicionei o

<security>
  <requestFiltering>
    <requestLimits maxQueryString="2048"></requestLimits>
  </requestFiltering>
</security>

chave para o arquivo de configuração da web abaixo da chave.

Não há alegria por lá, então fiquei ridículo e fiz 4096, ainda sem alegria.

Agora, com a URL inteira com 966 caracteres, o atributo authorize não pode adicionar seriamente outros 1082-3130, portanto, como posso determinar qual é realmente o erro ou por que a configuração não está entrando em vigor.

VS2010 Pro SP1

Sabre
fonte
Por favor, adicione a mensagem de erro detalhada que você está recebendo.
counsellorben

Respostas:

70

Quando uma solicitação não autorizada é recebida, a solicitação inteira é codificada em URL e adicionada como uma sequência de consultas à solicitação no formulário de autorização, para que eu possa ver onde isso pode resultar em um problema, dada a sua situação.

De acordo com o MSDN, o elemento correto a ser modificado para redefinir o maxQueryStringLength no web.config é o <httpRuntime>elemento dentro do <system.web>elemento, consulte Elemento httpRuntime (esquema de configurações do ASP.NET) . Tente modificar esse elemento.

counsellorben
fonte
1
Infelizmente, colocá-lo no lugar correto parece ser o truque, interessando bastante o senso comum me guia para a mesma chave no local em que originalmente o publiquei.
Sabre
8
Também é bom saber que o valor máximo desse parâmetro é 2097151 - no começo, tentei usar o Int32.MaxValue, mas a exceção lançada no tempo de execução indicou que eu usasse um valor entre 0 e 2097151.
TimDog
não está funcionando veja isso. stackoverflow.com/questions/31624710/…
Jitendra Pancholi
1
Acredito que, embora você possa definir o valor máximo desse parâmetro para 2097151, existem outros parâmetros que afetam o tamanho máximo da consulta aceito. Eu tinha uma string de consulta muito menor que esse máximo que não era aceito - tinha 3.393 caracteres. Outra consulta com 3.200 caracteres funcionou bem.
precisa saber é o seguinte
@ markthewizard1234: De acordo: Eu aumentei meu de 2048 para 4096. Isso tem tido algum efeito, como a mensagem de erro original com 404.something para a string de consulta overlong não aparece mais. Mas agora, outra mensagem de erro com o código 400 é retornada, indicando também uma seqüência de consulta longa.
OR Mapper
212

Na raiz web.configdo seu projeto, no system.webnó:

<system.web>
    <httpRuntime maxUrlLength="10999" maxQueryStringLength="2097151" />
...

Além disso, eu tive que adicionar isso no system.webServernó ou obtive um erro de segurança para minhas longas sequências de consulta:

<system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxUrl="10999" maxQueryString="2097151" />
      </requestFiltering>
    </security>
...
theJerm
fonte
1
Abrir isso cria sérias falhas de segurança? Quais negativos existem para definir maxurl e maxquery para 2097151?
Brian
1
Brian, essa é uma boa pergunta - não vejo falhas de segurança, a menos que, de alguma forma, colocar algo mais na string de consulta além do limite do navegador possa ser prejudicial. As seqüências de consulta de comprimento máximo do navegador têm precedência sobre esse valor é outra pergunta para a qual não tenho a resposta. Obrigado por perguntar, talvez alguém aqui possa esclarecer mais isso.
theJerm
Eu acho que existe uma potencial vulnerabilidade do DOS, mas isso depende de como você realmente lida com a solicitação. Eu me deparei com isso ao tentar adicionar 100 usuários em uma solicitação. Não é algo que eu queira que aconteça de qualquer maneira.
Martin
4
Isso resolveu meu problema imediatamente, pois eu estava tendo o mesmo problema em um projeto MVC 4. A adição dos dois itens acima resolveu meu erro. Muito obrigado!!
Ed Degagne
3
Lembre-se de que maxQueryStringé o comprimento em bytes como uint com um valor máximo de 4294967295 e maxQueryStringLengthé o comprimento em caracteres como int, mas com um intervalo de 0-2097151.
marsze
5

Para qualquer outra pessoa que possa encontrar esse problema e não for resolvida por nenhuma das opções acima, é isso que funcionou para mim.

1. Click on the website in IIS
2. Double Click on Authentication under IIS
3. Enable Anonymous Authentication

Desativei isso porque estávamos usando nosso próprio Auth, mas isso levou a esse mesmo problema e a resposta aceita não ajudou em nada.

dball
fonte
4

Eu tenho esse erro usando datatables.net

Corrigi a alteração do ajax padrão Get to POST nas propriedades do DataTable ()

"ajax": {
        "url": "../ControllerName/MethodJson",
        "type": "POST"
    },
elblogdelbeto
fonte
Também estava usando tabelas de dados e, depois de tentar sem êxito as sugestões acima, esse truque foi o suficiente.
Aidam