2010-01-18 39 views
16

Tôi có một ứng dụng MVC.NET với một lộ trình như sau:Làm cách nào để cho phép "Ký tự không hợp lệ trong đường dẫn"?

routes.MapRoute("member", "member/{id}/{*name}", new { controller = "member", action = "Details", id = "" }, new { id = @"\d+" });

Do đó, một liên kết có thể là một cái gì đó như thế này: http://domain/member/123/any_kind_of_username

này hoạt động tốt nói chung nhưng nếu đường dẫn chứa bất hợp pháp ký tự (ví dụ: qoute kép: http://domain/member/123/my_ "người dùng" _name) Tôi nhận được "System.ArgumentException: Ký tự không hợp lệ trong đường dẫn".

Sau khi có nhiều gợi ý, đề xuất tốt nhất có vẻ là đảm bảo rằng url không chứa bất kỳ ký tự nào như vậy. Thật không may, đó là ngoài tầm kiểm soát của tôi trong trường hợp này.

Có cách nào để giải quyết vấn đề này không?

+2

có lẽ chúng được gọi là các ký tự không hợp lệ vì bạn không thể sử dụng chúng ... –

+0

Không phải chúng có được mã hóa URL không? – Oded

+1

@Mitch - Vâng, một trích dẫn kép, ví dụ, hoạt động tốt cho Apache vì vậy tôi không thể thấy lý do tại sao IIS sẽ không cho phép nó. @Oded - Vấn đề là tôi không kiểm soát được các url này. – hbruce

Trả lời

1

Bạn nên mã hóa URL URL ở cuối ứng dụng trước khi gửi. Thử sử dụng phương thức UrlHelper.Encode.

+0

Xin lỗi, điều tương tự ở đây như với các đề xuất khác cho đến nay. Tôi sợ tôi không kiểm soát được các url ở cuối khách hàng. – hbruce

+3

Tôi nhận được rằng ngay cả khi mã hóa URI được gửi từ khách hàng – IsmailS

4

Tắt, bạn có thể tránh điều này bằng cách đặt allowDoubleEscaping = "false" trong requestFiltering in web.Config. tức là:

<configuration> 
    <system.webServer> 
    <security> 
     <requestFiltering allowDoubleEscaping="false" /> 
    </security> 
    </system.webServer> 
</configuration> 

Có lẽ không phải là giải pháp hoàn hảo (bất cứ đề nghị cho một tốt hơn được nhiều đánh giá cao), nhưng nó giải quyết vấn đề.

+0

@hbruce: Đó là giải pháp tốt nhất mà tôi đã tìm thấy cho đến nay, cảm ơn! – PanJanek

+1

có tác dụng phụ khá nghiêm trọng - bạn không còn có thể sử dụng các ký tự như '+' trong URL nếu bạn bật cài đặt này. xem: http://stackoverflow.com/questions/1453218/is-enabling-double-escaping-dangerous –

0

Điều gì về dấu và (&) trong url? Ví dụ: mysite.com/JellyBeans/PB & J, trong đó "PB & J" là giá trị tham số trong phương thức hành động của bộ điều khiển. Làm thế nào để bạn có được xung quanh MVC và động cơ ASP.NET từ điều trị đó như là một char bất hợp pháp trong chuỗi url cơ sở? Mã hóa với một% 26 không xuất hiện để hoạt động. Điều kỳ lạ, khi khởi chạy VS gỡ lỗi máy chủ web cục bộ (VS được xây dựng trong máy chủ web) xử lý trường hợp tốt (cả hai là & và% 26), nhưng khi được triển khai tới máy chủ web chạy IIS7, kết quả url sẽ là "Yêu cầu không hợp lệ" ".

+2

Máy chủ web tích hợp VS.NET khá phù hợp và không tuân thủ tiêu chuẩn. Nếu bạn gặp phải bất kỳ hành vi kỳ quặc nào, bạn nên bỏ qua nó và chỉ sử dụng IIS. –

7

Scott Hanselman đăng một bản tóm tắt tốt trên allowing illegal characters in the path.

Nếu bạn thực sự muốn cho phép nhân vật bị hạn chế, loại bỏ chúng khỏi danh sách bằng cách chỉnh sửa web.config của bạn (điều này có thể sẽ chỉ hoạt động trong .NET 4 và trên IIS7):

<system.web> 
    <httpRuntime requestValidationMode="2.0" relaxedUrlToFileSystemMapping="true" requestPathInvalidCharacters="&lt;,&gt;,*,%,:,&amp;,\" /> 
</system.web> 

Bạn cũng có thể cần phải làm như hbruce suggests:

<system.webServer> 
    <security> 
     <requestFiltering allowDoubleEscaping="true"/> 
    </security> 
</system.webServer> 

Hiện vẫn còn một số đường dẫn nhất định thứ tại sẽ không hoạt động, (chẳng hạn như/search /%) vì bạn sẽ nhận được thông báo 400 "Yêu cầu không hợp lệ - URL không hợp lệ". Cách giải quyết duy nhất mà tôi tìm thấy là sử dụng phần đó làm chuỗi truy vấn:/search? Q =% với các bước trên.

+0

Có phương án thay thế cho .net 2 không? – lathomas64

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