2008-10-27 42 views
33

Có chức năng nào chuyển đổi chuỗi Url thoát thành dạng không thoát của nó không? System.Web.HttpUtility.UrlDecode() có thể thực hiện công việc đó nhưng tôi không muốn thêm tham chiếu đến System.Web.dll. Vì ứng dụng của tôi không phải là một ứng dụng web, tôi không muốn thêm một phụ thuộc chỉ sử dụng một hàm trong một assembly.Giải mã Url đã thoát mà không sử dụng HttpUtility.UrlDecode

CẬP NHẬT: Kiểm tra Rick Strahl's blog post về cùng một vấn đề.

+1

Bài đăng của Rick Strahl là phải đọc - nó chứa nền tảng cần thiết và phân tích sâu về các giải pháp khác nhau mà .NET framework cung cấp (hoặc không cung cấp). – Oliver

+0

Bản sao có thể có của [Làm cách nào để giải mã tham số URL bằng C#?] (Http://stackoverflow.com/questions/1405048/how-do-i-decode-a-url-parameter-using-c) –

Trả lời

58

EDIT: Sử dụng phương pháp tĩnh Uri.UnescapeDataString() để giải mã URL của bạn:

Encoded:http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d

Giải mã:http://www.google.com/search?hl=en&q=something #23&btnG=Google+Search&aq=f&oq=

+0

điều này không làm việc cho tôi nó chỉ trả về chuỗi ban đầu vượt qua để 'Uri.UnescapeDataString (myurl)' – Smith

+6

Hãy coi chừng: Điều này không làm việc cho dấu cộng - http://blogs.msdn.com/b/ yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx Tôi vẫn đang tìm kiếm một phương pháp tốt hơn. –

+2

@Chris: Rick Strahl đã xây dựng một lớp tiện ích xung quanh 'Uri.UnescapeDataString()' xử lý các dấu hiệu '+' một cách chính xác. Xem [bài đăng trên blog của anh ấy] (http://www.west-wind.com/weblog/posts/617930.aspx) để biết thêm chi tiết. – Oliver

0

Nhóm ACE của Microsoft có phiên bản giải mã mở rộng (và tốt hơn), trong Anti-XSS library. Tuy nhiên, tôi không chắc chắn nếu nó chỉ đi qua.

(Tôi không thấy lý do tại sao bạn thấy lo lắng về sự phụ thuộc vào System.Web.dll phải trung thực)

+0

Lý do là tôi không muốn tải một DLL khá lớn vào không gian bộ nhớ của tôi vì lợi ích của chỉ có một cuộc gọi phương thức. Nó sẽ là tốt nếu ai đó chỉ một thực hiện (có thể sử dụng Regex) mà tôi có thể sao chép/dán vào dự án của tôi. – huseyint

+0

Một giải pháp regex sẽ không đủ; giải mã là * cứng *. Nếu bạn thực sự lo lắng thì, * ho *, phản xạ. Bạn đã thực sự xem xét chi phí bộ nhớ của việc lắp ráp? Nó có thể không lớn như bạn nghĩ. – blowdart

+1

Lưu ý rằng các phiên bản khung công tác khác nhau (đặc biệt là "hồ sơ khách hàng") là một lý do hợp lệ để tránh nó - nhưng không đáng được * quá * kích thích nó ;-p –

0

Bạn đã có một sự phụ thuộc rất lớn về .NET framework, CLR etal. Vì vậy, trên thực tế, bạn đã có một sự phụ thuộc gián tiếp trên System.Web.DLL; ứng dụng của bạn KHÔNG THỂ RUN mà không có sự hiện diện của nó trên máy cục bộ.

Và bạn lo lắng về bộ nhớ? Bạn có vấn đề về bộ nhớ? Nếu bạn có vấn đề về bộ nhớ quá khắc nghiệt, bạn không thể tải một vài KB DLL vào bộ nhớ của ứng dụng, thì tại sao bạn lại mã hóa .NET? Hay bạn chỉ cần tối ưu hóa sớm?

Vì vậy, đừng lo lắng về điều đó.

+5

Xác nhận của bạn không chính xác; "hồ sơ khách hàng", "cf" và "silverlight" sẽ thiếu System.Web.dll; "hồ sơ khách hàng" là một phiên bản của NET thông thường, vì vậy là nổi bật nhất. –

+1

@marc iirc khi điều này được trả lời, hồ sơ khách hàng không được phát hành/thường được biết đến. Thứ hai, anh ta không nói loại ứng dụng nào, và trên thực tế từ cách anh ta đặt câu hỏi rõ ràng rằng nó là một tùy chọn để tham khảo system.web.dll. Nếu không thì câu hỏi là tranh luận. Vì vậy, khẳng định của tôi là rất có thể chính xác. Nyah. – Will

4

Không tải System.Web.dll - như những người khác đã lưu ý, nó không phải là giá trị nhận được vui mừng, trừ khi bạn biết rằng bạn cần phải đối phó với khách hàng mà có thể không có nó ("hồ sơ khách hàng", "khuôn khổ nhỏ gọn" , "vi khung", "silverlight").

Re space; nó sẽ không thực sự nhiều; lưu ý rằng các assembly .NET được JITted trên cơ sở từng phương thức, do đó sẽ không có bất kỳ chi phí đáng kể nào chỉ từ việc sử dụng một vài phương thức.

Vấn đề thực (IMO) là mức độ tin cậy của bạn rằng khách hàng có System.Web.dll; nếu bạn hạnh phúc vì họ đang sử dụng khung làm việc đầy đủ, thì hãy tiếp tục.

+0

System.Web.dll là * rất * nặng, với * đáng chú ý * tác động khởi động. –

+0

@Máy tínhNhân viên ngôn ngữ cuộn trên vNext, eh? –

+0

Có gì khác đi cùng trong 7 năm? Tôi có nghĩa là, nó sẽ phải cho vNext. –

0

@Smith
Tôi đã có lưu vấn đề. Không có thay đổi hoặc chỉ cần thêm lúng túng.

Sau khi thử nghiệm nhiều thứ, tôi nhận thấy chuỗi kiểm tra đã giải mã. Cuối cùng tôi phải tạo một chuỗi rỗng mới, đặt giá trị của nó thành chuỗi được mã hóa rồi chạy WebUtility.HtmlDecodeUri.UnescapeDataString trên chuỗi mới. Vì lý do nào đó, tôi phải chạy giải mã và unescape theo thứ tự tôi đã đề cập. Kỳ lạ.

Tôi đã giải quyết nó bằng một cái gì đó như thế này.

Dim strEncoded as string="http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d" 

Dim strDecoded as string = "" 
strDecoded = strEncoded 
strDecoded = WebUtility.HtmlDecode(strDecoded) 
strDecoded = Uri.UnescapeDataString(strDecoded) 
-2

System.Net.WebUtility.HtmlDecode cũng đang hoạt động trên .NET 4.0 Hồ sơ khách hàng.

+2

Mã hóa/giải mã Url! = Mã hóa/giải mã Html. –

5

Nếu bạn đang sử dụng .NET 4.0 hoặc sau đó, bạn có thể sử dụng WebUtility.UrlDecode hoạt động với hồ sơ khách hàng và cũng xử lý chính xác các dấu cộng (xem this thảo luận).

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