2016-11-04 37 views
6

Röportajda HTTP module ve HTTP handler'un ASP.Net MVC'da nasıl uygulanacağına dair bir soru soruldu. ASPX sayfasında, aspx sayfası çağrılmadan önce ön işleme mantığı yazmak için kullanıldığını biliyorum. Ancak ASP.Net MVC'de bunun için filtrelerimiz var, böylece Filtreler'i bunun için kullandıklarını söyledim. Doğru cevabı verdim mi?ASP.Net MVC'deki HTTP modülleri ve HTTP işleyicileri?

+0

Filtreler sadece kontrolörler tarafından ele istekleri için çağrılır. Daha genel olabilmek için IHttpHandler ve IHttpModule'ı kullanmanız gerekecek ... OWIN'de değilseniz, OWIN Middleware sınıfı olacaktır. – Dai

+0

Seni buraya getirmedim. OWIN hakkında emin değilim –

cevap

5

Action Filters, MVC'ye özgü olaylara bağlanmanıza izin verirken, HTTP Modülleri ASP.Net olaylarına bağlanmanıza izin verir, böylece MVC'de bile bir HTTP Modülü ve HTTP işleyicisi uygulamak için ilgili arabirimi uygulamanız gerekir. Ayrıca, işlevselliğinizin yalnızca Http İsteği başına bir kez yürütülmesini istiyorsanız, bir HttpModule kullanmalısınız. ActionFilters, sunucuya yapılan tek seferde birkaç kez gerçekleştirilebilir. HTTP Modülleri ve HTTP İşleyicileri açıklamak için, HTTP modülü ve HTTP işleyicisi, MVC tarafından istek zincirine ön işlem mantığı enjekte etmek için kullanılır.

HTTP İşleyicileri, olay tabanlı ön işlemcidir, HTTP Modülü ise olay tabanlı önişlemcidir. Örneğin, jpg dosyalarının nasıl işlendiğini değiştirmek isterseniz, isteğin işlenmesi sırasında ek mantık yürütmek istiyorsanız özel HTTP işleyicisi uygularsınız, özel bir HTTP modülü uygularsınız. Belirli bir istek için her zaman yalnızca bir HTTP işleyicisi vardır, ancak birden çok HTTP modülü olabilir. HTTP işleyicisini uygulamak için, IHTTPHandler sınıfını uygular ve ProcessRequest yöntemlerini uygular ve IsResuable numaralı mülkün özelliklerini uygularsınız. IsResuable özelliği, işleyicinin yeniden kullanılıp kullanılamayacağını belirler.

<httpHandlers> 
    <add verb="*" path="*.jpg" type="MyJpgHandler"/> 
</httpHandlers> 

biz IHttpModule uygulanması ve gerekli olayları kaydetmeniz gerekir, bir HTTP modülü uygulamak için:

public class MyJpgHandler: IHttpHandler { 
    public bool IsReusable { 
     get { 
      return false; 
     } 
    } 
    public void ProcessRequest(HttpContext context) { 
    } 
} 

Sonra web.config dosyada bizim özel işleyici tarafından ele alınacaktır istek hangi tür belirtmek gerekir init yönteminde.

public class MyHttpModule: IHttpModule { 
    public MyHttpModule() {} 
    public void Init(HttpApplication application) { 
     application.BeginRequest += new EventHandler(this.context_BeginRequest); 
     application.EndRequest += new EventHandler(this.context_EndRequest); 
    } 
    public void context_BeginRequest(object sender, EventArgs e) { 
     StreamWriter sw = new StreamWriter(@ "C:\log.txt", true); 
     sw.WriteLine("request began at " + DateTime.Now.ToString()); 
     sw.Close(); 
    } 

    public void context_EndRequest(object sender, EventArgs e) { 
     StreamWriter sw = new StreamWriter(@ "C:\log.txt", true); 
     sw.WriteLine("Request Ended at " + DateTime.Now.ToString()); 
     sw.Close(); 
    } 
    public void Dispose() {} 
} 

Ve modülü kayıt: Basit bir örnek olarak, isterse tüm istekleri günlüğe

<httpModules> 
    <add name="MyHttpModule " type="MyHttpModule " /> 
</httpModules>