2014-10-11 11 views
13

Uri si comporta in modo diverso in .Net4.0 vs .Net4.5How-to soluzione alternativa differenze con Uri e URL codificati in .Net4.0 vs .Net4.5 utilizzando HttpClient

var u = new Uri("http://localhost:5984/mycouchtests_pri/test%2F1"); 
Console.WriteLine(u.OriginalString); 
Console.WriteLine(u.AbsoluteUri); 

Esito NET4.0

http://localhost:5984/mycouchtests_pri/test%2F1 
http://localhost:5984/mycouchtests_pri/test/1 

Esito NET4.5

http://localhost:5984/mycouchtests_pri/test%2F1 
http://localhost:5984/mycouchtests_pri/test%2F1 

Quindi, quando si utilizzano le richieste HttpClientdistributed by Microsoft via NuGet come sopra, con .Net4.0, poiché HttpRequestMessage utilizza Uri.

Tutte le idee per una soluzione alternativa?

EDIT C'è un NON APPLICABILE soluzione aggiungendo configurazione per <uri> in es App.config o Machine.config (http://msdn.microsoft.com/en-us/library/ee656539(v=vs.110).aspx).

<configuration> 
    <uri> 
    <schemeSettings> 
     <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/> 
    </schemeSettings> 
    </uri> 
</configuration> 

Ma questa è una libreria strumenti, che non è proprio un'opzione. Se lo HttpClient per .Net4.0 dovrebbe essere alla pari con quello in .Net4.5, dovrebbero avere lo stesso comportamento.

+0

Si può vedere che 'u.OriginalString' fornisce gli stessi valori, indipendentemente da .net frameword, Quindi puoi usare solo questo, a meno che tu non abbia effettivamente bisogno dell'altro, Correggimi se ho torto! –

+0

Non ho il controllo. L'URI viene consumato da qualche parte nelle terre scure di HttpClient e dal gestore di messaggi associato. – Daniel

+0

Ho pensato, sei preoccupato dell'uso di 'OriginalString' vs' AbsoluteUri'! , Ma ancora non sono chiaro, per quello hai bisogno di soluzioni alternative! –

risposta

1

Mike Hadlow scritto a blog post on this qualche anno fa. Ecco il codice se ne uscì con per aggirare questo:

private void LeaveDotsAndSlashesEscaped() 
{ 
    var getSyntaxMethod = 
     typeof (UriParser).GetMethod("GetSyntax", BindingFlags.Static | BindingFlags.NonPublic); 
    if (getSyntaxMethod == null) 
    { 
     throw new MissingMethodException("UriParser", "GetSyntax"); 
    } 

    var uriParser = getSyntaxMethod.Invoke(null, new object[] { "http" }); 

    var setUpdatableFlagsMethod = 
     uriParser.GetType().GetMethod("SetUpdatableFlags", BindingFlags.Instance | BindingFlags.NonPublic); 
    if (setUpdatableFlagsMethod == null) 
    { 
     throw new MissingMethodException("UriParser", "SetUpdatableFlags"); 
    } 

    setUpdatableFlagsMethod.Invoke(uriParser, new object[] {0}); 
} 

Penso che solo imposta il flag che è disponibile da .config nel codice, così, mentre è hacky, non è esattamente non supportato.

+0

Che soffre dello stesso problema del file di configurazione: modifica l'impostazione per l'intero AppDomain. – TheESJ

+0

Grazie, ci siamo imbattuti in questo altrove. Anche una soluzione alternativa, ma non voglio chiamarla, in tal caso il consumatore dovrebbe farlo in modalità bootstrap o qualcosa del genere, in quanto potenzialmente "influenza" altre librerie in esecuzione nello stesso dominio. – Daniel

Problemi correlati