Tengo un punto final C # Web Api en un controlador que tiene un parámetro. Este parámetro acepta una cadena encriptada y esta cadena contendrá caracteres como "/", "&", "+", etc. Entonces, cada vez que llamo a mi punto final Api desde javascript, lo codifico usando la función encodeURIComponent. Como esperaba una cadena codificada, usé HttpUtility.UrlDecode en mi código Web Api para decodificarlo y usarlo en mi aplicación.

public HttpActionResult MyAction(string encodedString)
{
    string decodedString = HttpUtility.UrlDecode(encodedString);
    // Process request
}

Para verificar si el código funciona como se esperaba, comencé a depurar enviando cadenas codificadas como entrada. Para mi asombro, descubrí que el parámetro de entrada ya se decodifica por sí solo y lo pasa en el método de acción. Esto funcionó bien con el método de decodificador que he usado, pero comenzó a romperse cuando había un carácter "+". cuando paso una cadena con el carácter "+", el método del decodificador la cambia a un espacio en blanco.

Por ejemplo pasar djdh67-y&+dsdj al decodificador cambió a djdh67-y& dsdj

Hubo dos sorpresas para mí. Primero, ¿por qué se decodificó el parámetro por sí solo y, segundo, por qué el carácter "+" se decodificó en un espacio en blanco? No puedo usar este código hasta que entienda lo que está sucediendo porque puede haber sorpresas más adelante (tal vez se detiene la decodificación automática) que no serán buenas.

¿Alguien puede explicarme qué está sucediendo exactamente o cuál es la mejor manera de resolver este problema?

3
nak 16 sep. 2017 a las 17:52

2 respuestas

La mejor respuesta

Para resolver el problema, simplemente elimine la parte HttpUtility.UrlDecode(encodedString).

El valor que llega a la acción ya se ha descodificado y no es necesario que lo descodifique por segunda vez .

En tu ejemplo:

encodeURIComponent("djdh67-y&+dsdj")        -> djdh67-y%26%2Bdsdj // sent
HttpUtility.UrlDecode("djdh67-y%26%2Bdsdj") -> djdh67-y&+dsdj     // done
HttpUtility.UrlDecode("djdh67-y&+dsdj")     -> djdh67-y& dsdj     // wrong

Los valores no codificados en GET pueden ser interpretados incorrectamente por el navegador. p.ej. el símbolo & en la cadena de solicitud significa el siguiente parámetro. Es por eso que MVC "piensa" que todos los parámetros de obtención están codificados y decodificados.

En caso de que se requiera una cadena en estado no modificado, se debe pasar en el cuerpo de una solicitud POST.

7
ASpirin 17 sep. 2017 a las 07:13

Para agregar a la respuesta anterior, la cuestión de decodificar + carácter al espacio es cómo funciona la decodificación de codificación. Un espacio está codificado en + y, por lo tanto, lo decodificará en el espacio.

Puede ver lo siguiente en acción cuando hacemos una búsqueda en Google. Si escribe cualquier cadena con espacios en el cuadro de búsqueda de Google y hace clic en buscar, verifique la URL, tendrá un parámetro de consulta "q" que tendrá los términos de búsqueda. Estos se codificarán y los espacios en los términos se convertirán a +

0
nak 23 sep. 2017 a las 04:41