问题描述
Uri
在.Net4.0和.Net4.5中的行为不同
Uri
behaves differently in .Net4.0 vs .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
)。
EDITThere is a NON APPLICABLE workaround by adding configuration for <uri>
in e.g. App.config
or 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>
但是由于这是一个工具库,所以实际上不是一个选择。如果假设.Net4.0的 HttpClient
与.Net4.5中的相同,则它们应该具有相同的行为。
But as this is a tools library, that's not really an option. If the HttpClient
for .Net4.0 is supposed to be on par with the one in .Net4.5, they should have the same behavior.
推荐答案
Mike Hadlow写了。这是他想出的解决方法:
Mike Hadlow wrote a blog post on this a few years back. Here's the code he came up with to get round 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,但并非完全不受支持。
I think it just sets the flag that's available from .config
in code, so while it's hacky, it's not exactly unsupported.
这篇关于使用HttpClient的.Net4.0和.Net4.5与Uri和编码URL的方法差异的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!