2017-05-04 25 views
6

Trước .Net 4.5, có vẻ như System.Uri sẽ mã hóa các dấu gạch chéo được mã hóa, nhưng điều này đã được sửa. Tham chiếu: https://stackoverflow.com/a/20733619/188740System.Uri và dấu hai chấm được mã hóa (:)

Tôi đang gặp phải vấn đề tương tự với dấu hai chấm. System.Uri vẫn unencode mã hóa dấu hai chấm. Ví dụ:

 var uri = new Uri("http://www.example.com/?foo=http%3A%2F%2Fwww.example.com"); 
     var s = uri.ToString(); //http://www.example.com/?foo=http:%2F%2Fwww.example.com 

Chú ý cách %3A được chuyển trở lại : bởi System.Uri. Đây có phải là một lỗi? Cách giải quyết tốt nhất là gì?

Trả lời

4

Cách sử dụng Uri.AbsoluteUri thay thế?

var s = uri.AbsoluteUri; 
// http://www.example.com/?foo=http%3A%2F%2Fwww.example.com 

Theo nguồn, uri.ToString() vẻ như nó có logic để không dò tìm một số phần mà có thể được nhìn thấy trong khi here.AbsoluteUri có đơn giản hơn nhiều implementation.

Uri.ToString()

Theo tài liệu MSDN cho System.Uri.ToString():

Chuỗi dụ có chứa các đại diện kinh điển unescaped của instance Uri. Tất cả các ký tự không bị thoát trừ #,?, Và%.

Tuy nhiên theo ví dụ và sau khi thử một vài xâu hơn, có vẻ như việc thực hiện thực tế là somwhat như 'Chỉ :, *spaces là unescaped'

%3A (:) // gets unescaped 
%20 () // gets unescaped 
%2A (*) // gets unescaped 

%2b, %26, %23, %24, %25 (+, &, #, $, %) // Remain as-is (escaped) 

Liên kết khác

+0

AbsoluteUri hoạt động như một sự quyến rũ. Tại sao các dấu hai chấm không được mã hóa mà không có AbsoluteUri? Có vẻ như là một lỗi đối với tôi. –

+1

Có vẻ như vậy. Tôi tin rằng lỗi là một nơi nào đó [ở đây] (http://referencesource.microsoft.com/#System/net/System/URI.cs,1675) mà đi trước và unescapes phần nhất định. Trong khi '.AbsoluteUri' có một [thực hiện đơn giản hơn nhiều] (http://referencesource.microsoft.com/#System/net/System/URI.cs,738). – degant

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