2013-11-15 16 views
5

Something của một câu hỏi kỳ lạ nhưng chúng ta hãy xem những gì loại phản ứng nó được ...Uri.EscapeUriString với vuông niềng răng

Nếu tôi mã một ứng dụng giao diện điều khiển (VS 2013, NET 4.5.1) và thực hiện dòng này mã:

Uri.EscapeUriString("[")

tôi có được điều này:

[

Tuy nhiên nếu tôi thực hiện điều tương tự (tốt, về mặt kỹ thuật Uri.EscapeUriString("[").Dump()) trong LINQPad trên máy tính của tôi, tôi có được điều này:

%5B

Để làm phức tạp thêm điều gì đó, according to this postUri.EscapeUriString("[") thực sự phải trả lại %5B .Công bài được viết trên 27/06/2012.

Tôi nghĩ rằng có lẽ LINQPad đang tham khảo một DLL cũ hơn được sử dụng bởi VS, nhưng điều đó có nghĩa là EscapeUriString đã thay đổi tương đối gần đây, mà tôi không thể tìm thấy bất kỳ bản ghi nào. Có ai có bất kỳ ý tưởng nào về những gì có thể gây ra hành vi này không?

+0

WT? Tôi có thể repro trong 4.5.1! –

Trả lời

5

Điều này đã thay đổi giữa .Net 4 và .Net 4.5, bạn có thể xác minh bằng cách nhắm mục tiêu lại phiên bản khung lên .Net 4 và chạy chương trình thử nghiệm.

Net 4 -> đầu ra "% 5B" .net 4.5 (hoặc mới hơn) -> kết quả đầu ra "["

này được đề cập ở đây: Application Compatibility in the .NET Framework 4.5

dưới phần cho Uri.EscapeDataString , Uri.EscapeUriString, và Uri.UnescapeDataString, trong đó nêu rằng (với Net 4.5):

danh sách các nhân vật được bảo lưu và ưa thổ lộ bây giờ hỗ trợ RFC 3986.

thay đổi cụ thể:

Unreserved escaped characters are un-escaped. 
EscapeDataString escapes reserved characters based on RFC 3986. 
EscapeUriString does not escape reserved characters. 
UnescapeDataString does not throw an exception if it encounters an invalid escape sequence. 

Đặc biệt, nó là EscapeUriString không thoát khỏi nhân vật dành đó rất có ý nghĩa.

2

Hành vi mới có vẻ đúng theo RFC 2396. Trong dòng 566 nó nói:

566. Other characters are excluded because gateways and other transport 
567. agents are known to sometimes modify such characters, or they are 
568. used as delimiters. 
569. 
570. unwise  = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`" 

trong tài liệu hướng dẫn Uri.EscapeUriString 's nó khẳng định rằng

Theo mặc định, phương pháp EscapeUriString chuyển đổi tất cả các ký tự, ngoại trừ RFC 2396 ký tự ưa thổ lộ, để đại diện thập lục phân của họ

Vì vậy, có vẻ như đã có lỗi lên tới .NET 4.0 đã được khắc phục trong 4.5.1

+0

Không đúng. Lên đến .NET 4.0, RFC 2396 được theo dõi chính xác. Các ký tự không được thoát được liệt kê trên dòng 469, không phải là 570. dot Net 4.5.1 thực sự theo các ký tự được liệt kê trong cùng một phần của RFC 3986, khác nhau. –

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