2008-09-16 16 views
15

Belirli sayfaları bir HTTP modülünü kullanmaktan çıkarmanın iyi bir yolu var mı?Belirli sayfaların HTTPModule kullanmasını engelleyin

Bir oturumu doğrulamak için özel bir HTTP modülü kullanan bir uygulamam var. HttpModule web config böyle kurulur:

<system.web> 
    <!-- ... --> 
    <httpModules> 
    <add name="SessionValidationModule" 
     type="SessionValidationModule, SomeNamespace" /> 
    </httpModules> 
</system.web> 

sayfadan modülünü dışlamak için, ben (başarı olmadan) bunu çalıştı:

<location path="ToBeExcluded"> 
    <system.web> 
    <!-- ... --> 
    <httpModules> 
     <remove name="SessionValidationModule" /> 
    </httpModules> 
    </system.web> 
</location> 

Herhangi düşünceler?

cevap

11

HTTPModule yerine bir HTTPHandler kullanabilirsiniz. İşleyicileri, Web.Config içinde bildirdiğinizde bir yol belirtmenize izin verir.

<add verb="*" path="/validate/*.aspx" type="Handler,Assembly"/> 

Eğer HttpModule'ü kullanmanız gerekiyorsa, sadece isteğin yolunu kontrol edebilir ve hariç tutulacak birini ise, doğrulamayı atlamak. HttpModules, ASP.NET istek işleme hattının kendisine eklenir.

+0

Bu aynı yöntemi kullanıyorum ve sadece çalışmıyor. Bunun kabul edilen cevap nasıl olduğundan emin değil. – Kehlan

+0

Bunun yerine bir işleyici kullanmayı denedim, ancak bir işleyici, http bağlamını yeniden yönlendirdiği için geçerli görünmüyor. Burada sordum: http://stackoverflow.com/questions/27124737/asp-net-httphandler-prevents-page-from-loading?noredirect=1#comment42750773_27124737 – user1531921

13

HttpModule'ün, hareket etmek istediği ve hangi isteklerin göz ardı edilmesini istediği ile ilgili istekleri anlamaya özen göstermesi gerekir. Bu, örneğin, context.Request.Path özelliğine bakılarak gerçekleştirilebilir. Bu, örneğin, context.Request.Path özelliğine bakılarak gerçekleştirilebilir.

5

Aşağıda, istekleri uzantıya göre filtrelemek için basit bir örnek var ... aşağıdaki örnek, belirli uzantılara sahip işlem dosyalarından hariç tutuluyor. dosya adına göre filtreleme ... bazı küçük değişikliklerle birlikte hemen hemen aynı bakacağız

public class AuthenticationModule : IHttpModule 
{ 
    private static readonly List<string> extensionsToSkip = AuthenticationConfig.ExtensionsToSkip.Split('|').ToList(); 

    // In the Init function, register for HttpApplication 
    // events by adding your handlers. 
    public void Init(HttpApplication application) 
    { 
     application.BeginRequest += new EventHandler(this.Application_BeginRequest); 
     application.EndRequest += new EventHandler(this.Application_EndRequest); 
    } 

    private void Application_BeginRequest(Object source, EventArgs e) 
    { 
     // we don't have to process all requests... 
     if (extensionsToSkip.Contains(Path.GetExtension(HttpContext.Current.Request.Url.LocalPath))) 
      return; 

     Trace.WriteLine("Application_BeginRequest: " + HttpContext.Current.Request.Url.AbsoluteUri); 
    } 

    private void Application_EndRequest(Object source, EventArgs e) 
    { 
     // we don't have to process all requests... 
     if (extensionsToSkip.Contains(Path.GetExtension(HttpContext.Current.Request.Url.LocalPath))) 
      return; 

     Trace.WriteLine("Application_BeginRequest: " + HttpContext.Current.Request.Url.AbsoluteUri); 
    } 
} 

Genel bir fikir tam olarak işlenmiş (ya da işleme dahil) ne olması gerektiğini yapılandırma dosyasında belirtmek ve bu yapılandırma parametresini kullanmaktır modülü.

+0

Eski soru, ama mükemmel cevap ve örnek kod! Yalnızca öneri, daha hızlı aramalara ve çoğaltmaya neden olmamak üzere, extensionsToSkip için 'List <>' yerine 'HastSet <>' işlevini kullanmaktır. – BenSwayne

İlgili konular