En primer lugar, algunos antecedentes rápidos ... Como parte de una integración con un proveedor externo, tengo una aplicación web C# .Net que recibe una URL con un montón de información en el cadena de consulta. Esa URL está firmada con un hash MD5 y una clave secreta compartida. Básicamente, selecciono la cadena de consulta, elimino su hash, realizo mi propio hash en la cadena de consulta restante y me aseguro de que el mío coincida con el que se proporcionó..Net Uri Encoding RFC 2396 vs RFC 3986
estoy recuperando el URI de la siguiente manera ...
Uri uriFromVendor = new Uri(Request.Url.ToString());
string queryFromVendor = uriFromVendor.Query.Substring(1); //Substring to remove question mark
Mi problema se derivan de las cadenas de consulta que contienen caracteres especiales como diéresis (ü). El vendedor está calculando su hash basado en la representación RFC 2396 que es %FC
. Mi aplicación C# .Net está calculando que es hash basado en la representación RFC 3986 que es %C3%BC
. No hace falta decir que nuestros hash no coinciden y arrojo mis errores.
Extrañamente, el documentation for the Uri class in .Net dice que debe seguir RFC 2396 a menos que se establezca de otra manera en RFC 3986, pero no tengo la entrada en mi archivo web.config
que dicen es necesaria para este comportamiento.
¿Cómo puedo forzar al constructor de Uri a usar la convención RFC 2396?
En su defecto, ¿hay una manera fácil de convertir los pares de octetos RFC 3986 en octetos RFC 2396?
Nada que ver con su pregunta, pero ¿por qué está creando un nuevo Uri aquí? Simplemente puede hacer 'string queryFromVendor = Request.Url.Query.Substring (1);' – magnattic
¿Qué versión de .NET está usando? –
Estoy usando .Net 4.0. Además, curiosamente, cuando traté de usar 'Request.Url.Query', la diéresis venía como'% ufffd', que es el carácter.. – Colin