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

时间:2014-10-11 14:53:54

标签: c# .net-4.0 dotnet-httpclient

Uri在.Net4.0与.Net4.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

因此,当上述HttpClient distributed by Microsoft via NuGet请求使用.Net4.0时失败,因为HttpRequestMessage正在使用Uri

有关解决方法的任何想法吗?

修改 通过在{例如}中添加<uri>的配置,有非适用解决方法App.configMachine.confighttp://msdn.microsoft.com/en-us/library/ee656539(v=vs.110).aspx)。

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

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

1 个答案:

答案 0 :(得分:1)

几年前Mike Hadlow写了a blog post on this。以下是他想出来的代码:

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可用的标记,所以虽然它很糟糕,但它并不完全不受支持。