Cuando la clase .NET System.Uri
analiza cadenas, realiza cierta normalización en la entrada, como la configuración de la estructura inferior y el nombre de host. También recorta los períodos finales de cada segmento de ruta. Esta última característica es fatal para las aplicaciones OpenID porque algunos OpenID (como los emitidos por Yahoo) incluyen segmentos de ruta codificados en base64 que pueden finalizar con un período.Cómo crear una instancia de Uri analizada con GenericUriParserOptions.DontCompressPath
¿Cómo puedo desactivar este comportamiento de ajuste de período de la clase Uri?
El registro de mi propio esquema usando UriParser.Register
con un analizador inicializado con GenericUriParserOptions.DontCompressPath
evita el período de recorte, y algunas otras operaciones que también son indeseables para OpenID. Pero no puedo registrar un nuevo analizador para esquemas existentes como HTTP y HTTPS, que debo hacer para OpenID.
Otro enfoque que probé fue registrando mi nuevo esquema, y programar el analizador personalizado para cambiar el esquema de nuevo al estándar HTTP (s) esquemas como parte del análisis sintáctico:
public class MyUriParser : GenericUriParser
{
private string actualScheme;
public MyUriParser(string actualScheme)
: base(GenericUriParserOptions.DontCompressPath)
{
this.actualScheme = actualScheme.ToLowerInvariant();
}
protected override string GetComponents(Uri uri, UriComponents components, UriFormat format)
{
string result = base.GetComponents(uri, components, format);
// Substitute our actual desired scheme in the string if it's in there.
if ((components & UriComponents.Scheme) != 0)
{
string registeredScheme = base.GetComponents(uri, UriComponents.Scheme, format);
result = this.actualScheme + result.Substring(registeredScheme.Length);
}
return result;
}
}
class Program
{
static void Main(string[] args)
{
UriParser.Register(new MyUriParser("http"), "httpx", 80);
UriParser.Register(new MyUriParser("https"), "httpsx", 443);
Uri z = new Uri("httpsx://me.yahoo.com/b./c.#adf");
var req = (HttpWebRequest)WebRequest.Create(z);
req.GetResponse();
}
}
En realidad, esto casi trabajos. La instancia Uri
informa https en lugar de httpsx en todas partes, excepto la propiedad Uri.Scheme. Ese es un problema cuando pasa esta instancia Uri
al HttpWebRequest
para enviar una solicitud a esta dirección. Aparentemente, comprueba la propiedad Scheme y no la reconoce como 'https' porque simplemente envía texto sin formato al puerto 443 en lugar de SSL.
estoy feliz por cualquier solución que:
- Conserva detrás de los períodos en los segmentos de trazado en
Uri.Path
- incluye estos períodos en las solicitudes HTTP salientes.
- Lo ideal es que funcione con la confianza media de ASP.NET (pero no es absolutamente necesario).
Sería más fácil si su código de muestra fuera una prueba de unidad defectuosa para ilustrar cuál es el problema. – Simon
La prueba unitaria tendría que configurar un servidor web HTTPS para probar el error. :( –
¿Alguna vez resolvió esto con éxito? ¿Todavía necesita ayuda con esto? – jcolebrand