apa yang routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
Saya tidak dapat menemukan file .axd dalam proyek saya, dapatkah saya menghapus aturan rute ini?
Jawaban:
File .axd tidak ada secara fisik. ASP.NET menggunakan URL dengan ekstensi .axd (ScriptResource.axd dan WebResource.axd) secara internal, dan ditangani oleh HttpHandler.
Oleh karena itu, Anda harus mempertahankan aturan ini, untuk mencegah ASP.NET MVC mencoba menangani permintaan alih-alih membiarkan HttpHandler khusus melakukannya.
IgnoreRoute
konfigurasi perutean MVC adalah untuk memastikan bahwa MVC tidak mencoba menangani permintaan tersebut. Ini karena .axd
titik akhir perlu ditangani oleh penangan HTTP lain (penangan yang bukan bagian dari MVC) untuk menyajikan skrip.
Beberapa Latar Belakang
Jika Anda membuka file ini:
%WINDIR%\Microsoft.NET\Framework\version\Config\Web.config
Anda akan menemukan ini di dalam file:
<add path="WebResource.axd"
verb="GET"
type="System.Web.Handlers.AssemblyResourceLoader"
validate="True" />
Itu pada dasarnya memberitahu runtime Asp.NET: "Hai asp.net bung, jika permintaan datang untuk WebResource.axd kemudian gunakan AssemblyResourceLoader untuk memproses permintaan."
Harap dicatat bahwa WebResource.axd BUKAN sebuah file tetapi hanya sebuah peta (jika boleh saya katakan) AssemblyResourceLoader
. Ini adalah nama di mana pawang terdaftar. Di mesin saya, saya menemukan penangan .axd berikut:
<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"
Oke, jadi apa yang dilakukan pawang itu?
Mereka AssemblyResourceLoader
tahu bagaimana mencari file yang disematkan dalam sebuah assembly sehingga dapat menyajikannya (mengirimkannya ke klien yaitu browser). Misalnya, dalam formulir web asp.net, jika Anda menggunakan kontrol validasi, mereka bergantung pada beberapa javascript untuk menampilkan kesalahan pada halaman web. Namun, javascript itu tertanam dalam sebuah assembly. Browser membutuhkan javascript sehingga Anda akan melihat ini di html halaman:
<script src="/YourSite/WebResource.axd?d=fs7zUa...&t=6342..." type="text/javascript"></script>
Ini AssemblyResourceLoader
akan menemukan perakitan di mana javascript disematkan menggunakan informasi di querystring dan mengembalikan javascript.
Kembali ke Pertanyaan
Jadi untuk menjawab pertanyaan itu, apa itu:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
Itu memberi tahu mesin perutean bahwa kami tidak akan memproses permintaan yang cocok dengan pola rute itu. Dengan kata lain, kami tidak akan memproses .axd
permintaan. Mengapa? Karena MVC itu sendiri adalah HttpHandler yang mirip dengan .axd
dan .aspx
dan banyak penangan lain yang ada di file web.config. Penangan MVC tidak tahu bagaimana memproses permintaan seperti mencari sumber daya yang disematkan dalam rakitan-the AssemblyResourceLoader
tahu bagaimana melakukannya. MVC tahu bagaimana melakukannya, baik semua yang dilakukannya yang berada di luar cakupan pertanyaan dan jawaban ini.
Rute dengan pola {resource} .axd / {* pathInfo} disertakan untuk mencegah permintaan file resource Web seperti WebResource.axd atau ScriptResource.axd diteruskan ke pengontrol.
Tautan baca: http://msdn.microsoft.com/en-us/library/cc668201%28v=vs.100%29.aspx
Anda juga dapat menentukan bahwa perutean tidak boleh menangani permintaan URL tertentu. Anda mencegah perutean menangani permintaan tertentu dengan menentukan rute dan menentukan bahwa kelas StopRoutingHandler harus digunakan untuk menangani pola itu. Saat permintaan ditangani oleh objek StopRoutingHandler , objek StopRoutingHandler memblokir pemrosesan tambahan apa pun dari permintaan tersebut sebagai rute. Sebaliknya, permintaan diproses sebagai halaman ASP.NET, Layanan Web, atau titik akhir ASP.NET lainnya. Anda dapat menggunakan metode RouteCollection.Ignore (atau RouteCollectionExtensions.IgnoreRoute untuk aplikasi MVC) untuk membuat rute yang menggunakan kelas StopRoutingHandler .
Lihatlah tautan di bawah ini: http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx
Itu bukan file (tidak ada di disk) - mereka hanya nama yang terdaftar di beberapa penangan HTTP.