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时,.Net4.0之类的上述distributed by Microsoft via NuGet请求将失败,因为HttpRequestMessage使用的是Uri

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

编辑
通过添加<uri>的配置,例如,这是NON APPLICABLE 的变通方法。 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>

但是,由于这是一个工具库,因此并不是真正的选择。如果假定.Net4.0的HttpClient与.Net4.5中的ojit_code相等,则它们应具有相同的行为。

最佳答案

迈克·哈德洛(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中可用的标志,因此尽管它很hacky,但并非完全不受支持。

关于c# - 使用HttpClient的.Net4.0和.Net4.5与Uri和编码URL的方法差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26315934/

10-11 23:12