Apa itu routes.IgnoreRoute ("{resource} .axd / {* pathInfo}")

95

apa yang routes.IgnoreRoute("{resource}.axd/{*pathInfo}")

Saya tidak dapat menemukan file .axd dalam proyek saya, dapatkah saya menghapus aturan rute ini?

Eric Yin
sumber

Jawaban:

81

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.

Roy Dictus
sumber
5
Saya cukup yakin Anda ingin orang-orang dapat mengunduh "file axd" di situs Anda karena berisi javascript dan gaya.
Moulde
3
Jawaban ini salah. Alasan untuk memasukkan IgnoreRoutekonfigurasi perutean MVC adalah untuk memastikan bahwa MVC tidak mencoba menangani permintaan tersebut. Ini karena .axdtitik akhir perlu ditangani oleh penangan HTTP lain (penangan yang bukan bagian dari MVC) untuk menyajikan skrip.
NightOwl888
1
Apakah ini sepenuhnya tidak perlu dalam inti NET.? Saya telah mencari di Google selama satu jam atau lebih dan saya tidak dapat menemukan referensi apa pun tentang langkah-langkah yang setara, jadi saya berasumsi itu tidak diperlukan.
Dinerdo
35

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

Ini AssemblyResourceLoaderakan 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 .axdpermintaan. Mengapa? Karena MVC itu sendiri adalah HttpHandler yang mirip dengan .axddan .aspxdan 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 AssemblyResourceLoadertahu bagaimana melakukannya. MVC tahu bagaimana melakukannya, baik semua yang dilakukannya yang berada di luar cakupan pertanyaan dan jawaban ini.

CodingYoshi
sumber
2
Ini pasti sangat pasti harus menjadi jawaban yang diterima, ditambah satu dari saya.
Yahya
Akhirnya, penjelasan yang jelas tentang apa yang sebenarnya dilakukan WebResource.axd sementara juga memberikan jawaban yang jelas untuk pertanyaan tersebut. Terima kasih
ben_mj
18

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 .

Kumar Manish
sumber
7

Itu bukan file (tidak ada di disk) - mereka hanya nama yang terdaftar di beberapa penangan HTTP.

Kumar Manish
sumber
jawaban paling relevan yang akan saya katakan.
Sakthivel