Quando la classe .NET System.Uri
analizza le stringhe, esegue alcune operazioni di normalizzazione sull'input, ad esempio lo svuotamento dello schema e il nome host. Taglia inoltre i periodi finali da ogni segmento di percorso. Quest'ultima caratteristica è fatale per le applicazioni OpenID perché alcuni OpenID (come quelli emessi da Yahoo) includono segmenti di percorso codificati base64 che possono terminare con un punto.Come creare un'istanza Uri analizzata con GenericUriParserOptions.DontCompressPath
Come disabilitare questo comportamento di taglio periodico della classe Uri?
Registrazione mio sistema utilizzando UriParser.Register
con un parser inizializzato con GenericUriParserOptions.DontCompressPath
evita il periodo rifilatura, e alcune altre operazioni che sono anche indesiderabile per OpenID. Ma non posso registrare un nuovo parser per schemi esistenti come HTTP e HTTPS, che devo fare per OpenIDs.
Un altro approccio che ho provato era registrando il mio nuovo schema, e la programmazione del parser personalizzato per cambiare lo schema di nuovo alla standard HTTP (s) schemi come parte di analisi:
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();
}
}
Questo in realtà quasi lavori. L'istanza Uri
segnala https anziché httpsx ovunque, tranne la proprietà Uri.Scheme stessa. Questo è un problema quando si passa questa istanza Uri
allo HttpWebRequest
per inviare una richiesta a questo indirizzo. Apparentemente controlla la proprietà Scheme e non la riconosce come 'https' perché invia semplicemente testo in chiaro alla porta 443 anziché SSL.
Sono contento per qualsiasi soluzione che:
- Conserva punti finali in segmenti di percorso in
Uri.Path
- include questi periodi di richieste HTTP in uscita.
- Idealmente funziona con il supporto medio ASP.NET (ma non assolutamente necessario).
Sarebbe più facile se il codice di esempio fosse un test dell'unità guasto per illustrare qual è il problema. – Simon
Il test dell'unità dovrebbe configurare un server Web HTTPS per provare l'errore. :( –
Hai mai risolto questo problema con successo? Hai ancora bisogno di aiuto con questo? – jcolebrand