如何解决与 中的 Uri 和编码 URL 的差异.Net4.0 与 .Net4.5 使用 HttpClient

本文关键字:Net4 HttpClient 使用 URL 何解决 解决 Uri 中的 编码 | 更新日期: 2023-09-27 18:26:16

Uri在 中的行为不同。Net4.0 与 .净4.5

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

结果 NET4.0

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

结果 NET4.5

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

因此,当使用Microsoft通过 NuGet 分发的HttpClient时,如上所述的请求失败,并显示 .Net4.0,因为HttpRequestMessage正在使用Uri

有什么解决方法吗?

编辑有一个不适用的解决方法,例如添加<uri>配置。 App.configMachine.config(http://msdn.microsoft.com/en-us/library/ee656539(v=vs.110(.aspx(。

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

但由于这是一个工具库,所以这不是一个真正的选择。如果 HttpClient .Net4.0 应该与 中的 Net4.0 相当。Net4.5,它们应该具有相同的行为。

如何解决与 中的 Uri 和编码 URL 的差异.Net4.0 与 .Net4.5 使用 HttpClient

Mike Hadlow几年前写了一篇关于这个问题的博客文章。这是他想出的代码来解决这个问题:

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

我认为它只是设置了代码中.config可用的标志,所以虽然它很hack,但它并不是完全不受支持。