2011-09-05 23 views
7

Giả sử tôi muốn tạo một đối tượng Uri từ chuỗi sau:Tạo một Uri trong .NET tự động urldecodes tất cả các thông số từ chuỗi thông qua

string url = @"http://someserver.com?param1=1&url=http%3a%2f%2fwww.otherserver.com"; 
Uri uri = new Uri(url, UriKind.Absolute); 

Kết quả mong đợi sẽ là:

http://someserver.com?param1=1&url=http%3a%2f%2fwww.otherserver.com 

Thu được:

http://someserver.com/?param1=1&url=http://www.otherserver.com 

Hành vi tương tự cũng được nhận thấy trong nhiều phương pháp liên quan cho phép tạo Uri: Uri.TryCreate, UriBuilder.Uri, v.v.

Làm cách nào để nhận được Uri duy trì thông số được mã hóa ban đầu?

+0

Kết quả mong đợi khi làm gì? Nếu tôi thử mã của bạn trong một ứng dụng Console 'Console.WriteLine (uri.AbsoluteUri);' trả về url được mã hóa –

+1

Đối với các tìm kiếm khác liên quan đến điều này. Nó thực sự là phương thức ToString() giải mã chuỗi. .OriginalString hoặc .AbsoluteUri sẽ trả về chuỗi được mã hóa. Đối với url tương đối, hãy sử dụng .PathAndQuery – jishi

Trả lời

3

Hành vi này là documented:

Là một phần của hợp quy tại các nhà xây dựng đối với một số đề án, trốn cơ quan đại diện là đầm. Đề án cho URI nào sẽ chuỗi thoát nhỏ gọn bao gồm: tệp, http, https, net.pipe và net.tcp. Đối với tất cả các chương trình khác, chuỗi thoát được không được nén chặt. Ví dụ: nếu bạn mã hóa hai dấu chấm ".." là "% 2E% 2E" thì hàm tạo URI sẽ nén chuỗi này cho một số sơ đồ . Ví dụ: mẫu mã sau đây hiển thị một hàm tạo URI cho lược đồ http.

Vì vậy, một giải pháp tạm thời có thể tạm thời sử dụng lược đồ tùy chỉnh (ví dụ: leavemealone://) để xây dựng các đối tượng URL (có thể thông qua UriBuilder?).

4

Bạn đã "lấy" URL như thế nào? Nếu tôi di chuột qua nó trong Visual Studio, nó thực sự hiển thị URL đã giải mã.

Nhưng bất cứ khi nào tôi truy cập thông qua thuộc tính AbsoluteUri, nó sẽ hiển thị URL được mã hóa.

+0

Tôi đang mô tả hành vi được quan sát. Đó là một ứng dụng MVC asp.net nhưng nó không quan trọng. –

+0

Tôi không hỏi gì, tôi hỏi như thế nào. – CodeCaster

+0

ooops xin lỗi. Tôi hình thành bằng cách sử dụng định tuyến asp.net mvc nhưng tôi cần phải làm cho một số tweeks với nó. –

0

Trong trường hợp của tôi, tôi đã giải quyết nó bằng cách trả về phương thức ToString() của lớp UriBuilder thay vì sử dụng thuộc tính Uri của cùng một lớp.

4

Trong .NET4 bạn có thể vô hiệu hóa Uri nén cho một số chương trình via a configuration:

<configuration> 
    <uri> 
    <schemeSettings> 
     <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/> 
    </schemeSettings> 
    </uri> 
</configuration> 

Lưu ý rằng có những vấn đề bảo mật liên quan đến việc vô hiệu hóa các hành vi mặc định.

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