Pergunta

Como obter o consultor real do objeto Solicitação quando a consulta é Urlencoded ou tem caracteres percentuais no ASP.NET?

Basicamente, se eu tenho um URL como este: Default.aspx?p=%b4, como faço para obter uma corda preenchida com "%b4"?

Request.QueryString["p"] Retorna um caractere não imprimível.

Request.RawUrl Retorna default.aspx? p =%ufffd "

Request.Url.AbsoluteUri retorna default.aspx? p =%ef%bf%bd

Como posso recuperar o "%B4"?

Foi útil?

Solução

Eu me aproveitei mais e acredito que sei o que está causando isso: um cliente HTTP está enviando um URL para o servidor que não é adequadamente codificado por URL. Especificamente, existe um caractere inválido no URL.

Para reproduzir, cole o seguinte no final do seu URL no IE8: default.aspx?p=´

Se você examinar os bytes passando por cima do fio (por exemplo, usando Violinista), você verá que um caractere hexadecimal B4 está sendo enviado de cliente para servidor no URL. Este é um caráter ilegal em um URL, uma vez que os URLs são limitados a códigos de char sob 0x80 (qualquer código de char maior do que o 0x80 deve ser porcentagem).

Portanto, seu cliente está passando em um caractere inválido, e seu servidor está (corretamente) substituindo o caractere falso por%ef%bf%bd, que é a codificação UTF-8 para o Caractere de substituição unicode (u+0ffd), que é o que acontece quando um personagem é encontrado, o que não tem equivalente na codificação local.

Afaik, este é um bug no IE. Se você digitar o mesmo URL no Firefox, o Firefox codificará o URL corretamente (como %B4 em vez de '). Observe que, também AFAIK, o problema só acontece ao colar manualmente caracteres inválidos na barra de endereços do IE- se o mesmo personagem estiver presente em um link, ou seja, parece codificar o URL corretamente (pelo menos nos casos que testei).

Então, você deve descobrir quem está enviando esse URL falso para você e diga a eles para começarem a codificar seus URLs corretamente!

Outras dicas

O ASP.NET irá automaticamente o URL decodificar coisas quando você solicitar.QueryString ["key"]. Você só precisa codificá -lo novamente.

HttpUtility.UrlEncode(Request.QueryString["p"])
HttpContext.Current.Request.ServerVariables["QUERY_STRING"]

Vai devolver a corda de consulta bruta

Eu tive o mesmo problema. Eu resolvi apenas adicionando o JavaScript "Escape ('text % text')" enquanto contruta a história!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top