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?
cevap
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>
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
Seni buraya getirmedim. OWIN hakkında emin değilim –