significado informatica entre diferencia c# .net-4.0 dotnet-httpclient

c# - informatica - uri significado



Diferencias de soluciĆ³n de procedimientos con URI y URL codificadas en.Net4.0 vs.Net4.5 utilizando HttpClient (1)

Uri comporta de manera diferente en .Net4.0 vs .Net4.5

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

Resultado NET4.0

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

Resultado NET4.5

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

Por lo tanto, cuando se utiliza el HttpClient distribuido por Microsoft a través de NuGet, las solicitudes como la anterior fallan con .Net4.0, ya que HttpRequestMessage está utilizando el Uri .

¿Alguna idea para una solución alternativa?

EDITAR Hay una solución alternativa NO APLICABLE agregando configuración para <uri> en, por ejemplo, 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>

Pero como se trata de una biblioteca de herramientas, no es realmente una opción. Si se supone que HttpClient for .Net4.0 está a la par con el de .Net4.5, deberían tener el mismo comportamiento.


Mike Hadlow escribió una publicación en el blog sobre esto hace unos años. Aquí está el código que se le ocurrió para evitar esto:

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}); }

Creo que simplemente establece la bandera que está disponible desde .config en el código, por lo tanto, aunque es cursi, no es exactamente incompatible.