2014-10-11 15 views
13

Uri cư xử khác nhau trong .Net4.0 vs .Net4.5Làm thế nào để workaround khác biệt với Uri và URL mã hóa trong .Net4.0 vs .Net4.5 sử dụng HttpClient

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

Kết quả NET4.0

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

Kết quả NET4.5

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

Vì vậy, khi sử dụng các yêu cầu HttpClientdistributed by Microsoft via NuGet như lỗi trên với .Net4.0, kể từ khi HttpRequestMessage đang sử dụng Uri.

Bất kỳ ý tưởng nào để giải quyết sự cố?

EDITmột NON HIỆN HÀNH workaround bằng cách thêm cấu hình cho <uri> trong ví dụ App.config hoặc 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> 

Nhưng vì đây là thư viện công cụ, đây thực sự không phải là tùy chọn. Nếu số HttpClient cho .Net4.0 được coi là ngang bằng với giá trị trong .Net4.5, chúng sẽ có cùng hành vi.

+0

Bạn có thể thấy rằng 'u.OriginalString' cho cùng một giá trị, bất kể frameword .net, Vì vậy, bạn có thể sử dụng chỉ, trừ khi bạn thực sự cần sự khác, Sửa lỗi nếu tôi sai! –

+0

Tôi không kiểm soát được. URI được tiêu thụ ở đâu đó trong vùng đất tối của HttpClient và trình xử lý tin nhắn liên quan. – Daniel

+0

Tôi nghĩ, bạn quan tâm đến việc sử dụng 'OriginalString' và' AbsoluteUri'! , Nhưng tôi vẫn chưa rõ, vì bạn cần giải pháp! –

Trả lời

1

Mike Hadlow viết a blog post on this vài năm trước. Dưới đây là các mã ông đã đưa ra để có được vòng này:

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

Tôi nghĩ rằng nó chỉ đặt cờ đó là có sẵn từ .config trong mã, vì vậy trong khi nó hacky, nó không chính xác không được hỗ trợ.

+0

Điều đó gặp phải vấn đề tương tự như tệp cấu hình: nó sửa đổi cài đặt cho toàn bộ AppDomain. – TheESJ

+0

Cảm ơn, đã vấp ngã ở nơi khác. Cũng là một cách giải quyết, nhưng tôi không muốn gọi nó, trong trường hợp đó người tiêu dùng sẽ phải làm điều đó trong chế độ bootstrap hoặc cái gì đó, điều này vì nó có khả năng "ảnh hưởng" libs đang chạy khác trong cùng một miền. – Daniel

Các vấn đề liên quan