Các tuyến đường là gì.IgnoreRoute (“{resource} .axd / {* pathInfo}”)


95

Những gì là routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

Tôi không thể tìm thấy bất kỳ tệp .axd nào trong dự án của mình, tôi có thể xóa quy tắc định tuyến này không?

Câu trả lời:


81

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 đó.


5
Tôi khá chắc rằng bạn muốn mọi người có thể tải xuống "tệp axd" trên trang web của bạn vì chúng chứa javascript và kiểu.
Moulde

3
Câu trả lời này không chính xác. Lý do đưa IgnoreRoutevà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.
NightOwl888

1
Điều này có hoàn toàn không cần thiết trong lõi .NET không? Tôi đã tìm kiếm trên Google trong một giờ hoặc lâu hơn và tôi không thể tìm thấy bất kỳ tài liệu tham khảo nào cho các bước tương đương, vì vậy tôi cho rằng nó đơn giản là không cần thiết.
Dinerdo

35

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 AssemblyResourceLoaderbiế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...&amp;t=6342..." type="text/javascript"></script>

Các AssemblyResourceLoadersẽ 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ý .axdcác yêu cầu. Tại sao? Vì bản thân MVC là một HttpHandler tương tự như .axd.aspxvà 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- AssemblyResourceLoaderbiế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.


2
Điều này chắc chắn hoàn toàn chắc chắn phải là câu trả lời được chấp nhận, cộng với một câu trả lời từ tôi.
Yahya

Cuối cùng, một lời giải thích rõ ràng về những gì WebResource.axd thực sự làm trong khi cũng cung cấp câu trả lời rõ ràng cho câu hỏi. Cảm ơn bạn
ben_mj

18

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 .



7

Đó 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ý.


câu trả lời phù hợp nhất tôi sẽ nói.
Sakthivel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.