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.