Câu trả lời:
Các tệp .axd không tồn tại thực tế. ASP.NET sử dụng các URL có phần mở rộng .axd (ScriptResource.axd và WebResource.axd) trong nội bộ và chúng được xử lý bởi một HttpHandler.
Do đó, bạn nên giữ quy tắc này, để ngăn ASP.NET MVC cố gắng xử lý yêu cầu thay vì để HttpHandler chuyên dụng làm điều đó.
IgnoreRoute
vào cấu hình định tuyến của MVC là để đảm bảo rằng MVC không cố gắng xử lý yêu cầu. Điều này là do các .axd
điểm cuối cần được xử lý bởi một trình xử lý HTTP khác (một trình xử lý không phải là một phần của MVC) để phân phát các tập lệnh.
Một số nền
Nếu bạn mở tệp này:
%WINDIR%\Microsoft.NET\Framework\version\Config\Web.config
bạn sẽ tìm thấy điều này trong tệp:
<add path="WebResource.axd"
verb="GET"
type="System.Web.Handlers.AssemblyResourceLoader"
validate="True" />
Về cơ bản, điều đó nói với thời gian chạy Asp.NET: "Này anh bạn asp.net, nếu một yêu cầu đến với WebResource.axd thì hãy sử dụng AssemblyResourceLoader để xử lý yêu cầu."
Xin lưu ý rằng WebResource.axd KHÔNG phải là một tệp mà chỉ đơn giản là một bản đồ (nếu tôi có thể nói) AssemblyResourceLoader
. Nó là tên mà trình xử lý được đăng ký. Trên máy của mình, tôi đã tìm thấy các trình xử lý .axd sau:
<add path="eurl.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" />
<add path="trace.axd" verb="*" type="System.Web.Handlers.TraceHandler" validate="True" />
<add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True" />
<add verb="*" path="*_AppService.axd"
Ok, vậy trình xử lý đó làm gì?
Các AssemblyResourceLoader
biết làm thế nào để tìm kiếm cho các tập tin nhúng trong một assembly để nó có thể phục vụ nó (gửi nó cho khách hàng tức là một trình duyệt). Ví dụ: trong các biểu mẫu web asp.net, nếu bạn sử dụng các điều khiển xác thực, chúng phụ thuộc vào một số javascript để hiển thị các lỗi trên trang web. Tuy nhiên, javascript đó được nhúng trong một assembly. Trình duyệt cần javascript vì vậy bạn sẽ thấy điều này trong html của trang:
<script src="/YourSite/WebResource.axd?d=fs7zUa...&t=6342..." type="text/javascript"></script>
Các AssemblyResourceLoader
sẽ tìm assembly mà javascript được nhúng sử dụng các thông tin trong chuỗi truy vấn và trả lại javascript.
Quay lại câu hỏi
Vì vậy, để trả lời câu hỏi, là gì:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
Điều đó nói với công cụ định tuyến rằng chúng tôi sẽ không xử lý những yêu cầu phù hợp với mẫu định tuyến đó. Nói cách khác, chúng tôi sẽ không xử lý .axd
các yêu cầu. Tại sao? Vì bản thân MVC là một HttpHandler tương tự như .axd
và .aspx
và nhiều trình xử lý khác có trong tệp web.config. Trình xử lý MVC không biết cách xử lý yêu cầu, chẳng hạn như tìm kiếm các tài nguyên được nhúng trong một assembly- AssemblyResourceLoader
biết cách thực hiện điều đó. MVC biết cách làm, tốt mọi thứ nó làm nằm ngoài phạm vi của câu hỏi và câu trả lời này.
Tuyến có mẫu {resource} .axd / {* pathInfo} được bao gồm để ngăn các yêu cầu đối với các tệp tài nguyên Web như WebResource.axd hoặc ScriptResource.axd được chuyển tới bộ điều khiển.
Liên kết đọc: http://msdn.microsoft.com/en-us/library/cc668201%28v=vs.100%29.aspx
Bạn cũng có thể chỉ định rằng định tuyến sẽ không xử lý các yêu cầu URL nhất định. Bạn ngăn định tuyến xử lý các yêu cầu nhất định bằng cách xác định một tuyến và chỉ định rằng lớp StopRoutingHandler nên được sử dụng để xử lý mẫu đó. Khi một yêu cầu được xử lý bởi một đối tượng StopRoutingHandler , thì đối tượng StopRoutingHandler sẽ chặn bất kỳ quá trình xử lý bổ sung nào của yêu cầu dưới dạng một tuyến. Thay vào đó, yêu cầu được xử lý dưới dạng trang ASP.NET, dịch vụ Web hoặc điểm cuối ASP.NET khác. Bạn có thể sử dụng phương thức RouteCollection.Ignore (hoặc RouteCollectionExtensions.IgnoreRoute cho các ứng dụng MVC) để tạo các tuyến sử dụng lớp StopRoutingHandler .
Hãy xem trong liên kết dưới đây: http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx
Đó không phải là các tệp (chúng không tồn tại trên đĩa) - chúng chỉ là tên mà một số trình xử lý HTTP được đăng ký.