2014-10-11 50 views
13

Uri表現不同.Net4.0 VS .Net4.5如何對使用的HttpClient

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

成果NET4.0解決辦法與URI和在.Net4.0 VS .Net4.5差異URL編碼

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 

因此,當使用HttpClientdistributed by Microsoft via NuGet請求類似上述失敗與.Net4.0,因爲HttpRequestMessage使用Uri

解決方法的任何想法?

EDIT一個不適用解決方法通過增加配置在<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中的一樣,它們應該具有相同的行爲。

+0

你可以看到'u.OriginalString'給出了相同的值,無論.net frameword如何,所以你可以只使用它,除非你真的需要另一個,糾正我,如果我錯了! – 2014-10-11 15:13:31

+0

我無法控制。 URI在HttpClient和相關消息處理程序的黑暗地區中消耗。 – Daniel 2014-10-11 15:43:29

+0

我想,你很關心使用'OriginalString' vs'AbsoluteUri'! ,但我仍然不清楚,因爲你需要解決方法! – 2014-10-11 15:47:44

回答

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,所以雖然它的哈克,它不完全不受支持的標誌。

+0

這會遭遇與配置文件相同的問題:它會修改整個AppDomain的設置。 – TheESJ 2014-10-13 21:06:01

+0

謝謝,在別處遇到此事。也是一種解決方法,但我不想調用它,在這種情況下,消費者必須以引導模式或其他方式執行此操作,因爲它可能「影響」同一個域中的其他正在運行的庫。 – Daniel 2014-10-14 06:38:47