Isso está bloqueado no nível do kernel do IIS. Como teste, retirei o módulo every no IIS para que ele nem sequer tivesse um manipulador de páginas estático e ainda exibisse a mensagem de erro 400.
Eu não acredito que seja possível com o IIS contornar isso. As configurações do registro que você mencionou são para outros tipos de caracteres restritos. Eu não vi uma alavanca para mudar essa funcionalidade.
Qual é o seu objetivo, evitar isso? Ele abre sua superfície de ataque mais amplamente, e não consigo imaginar um visitante legítimo sendo perdido como resultado do bloqueio de sequências incompletas de escape de URL.
Update2: Aqui estão três ótimos links sobre isso. Tanto Nazim Lala quanto Wade Hilmo, da equipe do IIS, escreveram sobre isso por causa da discussão em torno de sua pergunta. Também Scott Hanselman tem um ótimo post sobre a parte de querystring dentro do .NET:
- Uso de caracteres especiais no IIS - Nazim Lala
- Como os caracteres do bloco do IIS em URLs - Wade Hilmo
- Experiências no Wackiness - Scott Hanselman
Atualização: Eu verifiquei com um membro da equipe do IIS para obter uma resposta autoritária. Ele mencionou que o% é considerado um caractere inseguro de acordo com a RFC 1738 ( link ).
Este é o texto relevante:
Unsafe:
Characters can be unsafe for a number of reasons. The space character is unsafe because significant spaces may disappear and insignificant spaces may be introduced when URLs are transcribed or typeset or subjected to the treatment of word-processing programs. The characters "<" and ">" are unsafe because they are used as the delimiters around URLs in free text; the quote mark (""") is used to delimit URLs in some systems. The character "#" is unsafe and should always be encoded because it is used in World Wide Web and in other systems to delimit a URL from a fragment/anchor identifier that might follow it. The character "%" is unsafe because it is used for encodings of other characters. Other characters are unsafe because gateways and other transport agents are known to sometimes modify such characters. These characters are "{", "}", "|", "\", "^", "~", "[", "]", and "'".
All unsafe characters must always be encoded within a URL. For example, the character "#" must be encoded within URLs even in systems that do not normally deal with fragment or anchor identifiers, so that if the URL is copied into another system that does use them, it will not be necessary to change the URL encoding.
O IIS proativamente bloqueia isso no nível principal, uma medida de segurança proativa para minimizar a superfície de ataque.