Nedir routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
Projemde herhangi bir .axd dosyası bulamıyorum, bu yönlendirme kuralını kaldırabilir miyim?
Yanıtlar:
.axd dosyaları fiziksel olarak mevcut değildir. ASP.NET, dahili olarak .axd uzantılarına (ScriptResource.axd ve WebResource.axd) sahip URL'leri kullanır ve bunlar bir HttpHandler tarafından işlenir.
Bu nedenle, ASP.NET MVC'nin adanmış HttpHandler'ın bunu yapmasına izin vermek yerine isteği işlemeyi denemesini önlemek için bu kuralı korumalısınız.
IgnoreRoute
yönlendirme yapılandırmasına koymanın nedeni, MVC'nin isteği yerine getirmeye çalışmamasını sağlamaktır. Bunun nedeni .axd
, komut dosyalarına hizmet vermek için uç noktaların başka bir HTTP işleyicisi (MVC'nin parçası olmayan bir işleyici) tarafından işlenmesi gerektiğidir .
Biraz Arka Plan
Bu dosyayı açarsanız:
%WINDIR%\Microsoft.NET\Framework\version\Config\Web.config
bunu dosyanın içinde bulacaksınız:
<add path="WebResource.axd"
verb="GET"
type="System.Web.Handlers.AssemblyResourceLoader"
validate="True" />
Bu, temelde Asp.NET çalışma zamanını anlatmaktır: "Hey asp.net dostum, WebResource.axd için bir istek gelirse, isteği işlemek için AssemblyResourceLoader'ı kullanın."
Lütfen O notu WebResource.axd bir dosya değil (I derseniz) ama sadece bir harita AssemblyResourceLoader
. İşleyicinin kayıtlı olduğu addır. Makinemde aşağıdaki .axd işleyicilerini buldum:
<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"
Tamam, peki bu işleyici ne yapıyor?
AssemblyResourceLoader
O hizmet (bir tarayıcı yani müşteriye göndermek) böylece bir montaj içinde gömülü dosyaları aramak için nasıl bilir. Örneğin, asp.net web formlarında, doğrulama kontrollerini kullanırsanız, web sayfasındaki hataları göstermek için bazı javascriptlere bağlıdırlar. Ancak, bu javascript bir derlemeye gömülüdür. Tarayıcının javascript'e ihtiyacı var, bu yüzden bunu sayfanın html'sinde göreceksiniz:
<script src="/YourSite/WebResource.axd?d=fs7zUa...&t=6342..." type="text/javascript"></script>
AssemblyResourceLoader
JavaScript sorgu dizesi bilgileri kullanarak gömülü olduğu montaj bulup javascript dönecektir.
Soruya Geri Dön
Öyleyse soruyu cevaplamak için nedir:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
Bu, yönlendirme motoruna, bu yönlendirme modeliyle eşleşen istekleri işlemeyeceğimizi söylemektir. Başka bir deyişle, .axd
talepleri işleme koymayacağız. Neden? MVC kendisi benzer bir HttpHandler Çünkü .axd
ve .aspx
web.config dosyasında birçok diğer işleyicileri ve. MVC işleyicisi, bir derlemede gömülü kaynakları aramak gibi isteği nasıl işleyeceğini AssemblyResourceLoader
bilmez - bunu nasıl yapacağını bilir. MVC nasıl yapılacağını bilir, yaptığı her şey bu soru ve cevabın kapsamı dışındadır.
{Resource} .axd / {* pathInfo} kalıbına sahip yol, WebResource.axd veya ScriptResource.axd gibi Web kaynak dosyalarına yönelik isteklerin bir denetleyiciye iletilmesini önlemek için dahil edilmiştir.
Bağlantıyı okuyun: http://msdn.microsoft.com/en-us/library/cc668201%28v=vs.100%29.aspx
Yönlendirmenin belirli URL isteklerini işlememesi gerektiğini de belirtebilirsiniz. Bir yol tanımlayarak ve bu modeli işlemek için StopRoutingHandler sınıfının kullanılması gerektiğini belirterek, yönlendirmenin belirli istekleri işlemesini engellersiniz . Bir istek ile ele alındığında StopRoutingHandler nesnesi, StopRoutingHandler nesne blokları bir yol olarak isteğe herhangi bir ek işlem. Bunun yerine, istek bir ASP.NET sayfası, Web hizmeti veya başka bir ASP.NET uç noktası olarak işlenir. Sen kullanabilirsiniz RouteCollection.Ignore (veya yöntemi RouteCollectionExtensions.IgnoreRoute kullanmak yolları oluşturmak için MVC uygulamaları için) StopRoutingHandler sınıfını.
Aşağıdaki bağlantıya bir göz atın: http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx
Bunlar dosya değil (diskte mevcut değiller) - sadece bazı HTTP işleyicilerinin kayıtlı olduğu adlardır.