Cara bekerja dengan HttpModules di ASP.NET

Ada dua cara di mana Anda dapat memasukkan logika dalam pipa permintaan aplikasi ASP.NET - HttpHandlers dan HttpModules. HttpModule adalah komponen yang merupakan bagian dari pipeline pemrosesan permintaan ASP.NET dan dipanggil pada setiap permintaan yang dibuat untuk aplikasi Anda.

Perhatikan bahwa HttpModules dapat memiliki akses ke peristiwa siklus hidup permintaan dan karenanya dapat digunakan untuk mengubah respons juga. HttpModules umumnya digunakan untuk memasukkan masalah lintas sektoral seperti keamanan, logging, dll. Di pipeline pemrosesan permintaan dan juga dapat digunakan untuk penulisan ulang URL dan bahkan untuk membuat header kustom dalam respons.

Seperti yang dinyatakan dalam dokumentasi Microsoft, “Modul HTTP adalah rakitan yang dipanggil pada setiap permintaan yang dibuat untuk aplikasi Anda. Modul HTTP disebut sebagai bagian dari pipeline permintaan ASP.NET dan memiliki akses ke peristiwa siklus hidup di seluruh permintaan. Modul HTTP memungkinkan Anda memeriksa permintaan masuk dan keluar dan mengambil tindakan berdasarkan permintaan tersebut. ”

Untuk membuat HttpModule kustom, Anda harus membuat kelas yang mengimplementasikan antarmuka System.Web.IHttpModule. Untuk membuat HttpModule, ikuti langkah-langkah berikut:

  1. Buka Visual Studio IDE
  2. Klik File-> Proyek Baru
  3. Buat proyek perpustakaan kelas
  4. Tambahkan referensi ke perakitan System.Web untuk proyek ini
  5. Selanjutnya, buat kelas di dalam proyek ini yang mengimplementasikan antarmuka IHttpModule
  6. Tulis penangan untuk metode Init untuk menginisialisasi modul Anda dan berlangganan ke satu atau beberapa kejadian
  7. Secara opsional, terapkan metode Buang dalam modul kustom Anda

Sekilas, HttpModule kustom kami terlihat seperti ini:

kelas publik CustomHttpModule: IHttpModule

   {

       public void Buang ()

       {

           melempar NotImplementedException () baru;

       }

       public void Init (konteks HttpApplication)

       {

           melempar NotImplementedException () baru;

       }

   }

Cuplikan kode berikut menunjukkan bagaimana Anda dapat berlangganan acara di modul HTTP khusus Anda.

public void Init (konteks HttpApplication)

       {

           konteks.BeginRequest + = EventHandler baru (OnBeginRequest);

           konteks.EndRequest + = EventHandler baru (OnEndRequest);            

           context.LogRequest + = new EventHandler (OnLogRequest);

       }

Sekarang mari kita tulis kode untuk metode OnLogRequest. Metode ini dimaksudkan untuk mencatat jalur atau setiap permintaan ke file teks. Begini tampilan metode OnLogRequest:

public void OnLogRequest (pengirim objek, EventArgs e)

       {

           Konteks HttpContext = ((HttpApplication) pengirim) .Context;

           string filePath = @ "D: \ Log.txt";

           menggunakan (StreamWriter streamWriter = StreamWriter baru (filePath))

           {

               streamWriter.WriteLine (konteks.Request.Path);

           }

       }

Daftar kode berikut menggambarkan modul HTTP kustom lengkap.

kelas publik CustomModule: IHttpModule

   {

       public void Init (konteks HttpApplication)

       {

           konteks.BeginRequest + = EventHandler baru (OnBeginRequest);

           konteks.EndRequest + = EventHandler baru (OnEndRequest);          

           context.LogRequest + = new EventHandler (OnLogRequest);

       }

       public void OnLogRequest (pengirim objek, EventArgs e)

       {

           Konteks HttpContext = ((HttpApplication) pengirim) .Context;

           string filePath = @ "D: \ Log.txt";

           menggunakan (StreamWriter streamWriter = StreamWriter baru (filePath))

           {

               streamWriter.WriteLine (konteks.Request.Path);

           }

       }

       public void OnBeginRequest (pengirim objek, EventArgs e)

       {

           // Tulis kode khusus Anda di sini

       }

       public void OnEndRequest (pengirim objek, EventArgs e)

       {

           // Tulis kode khusus Anda di sini

       }

       public void Buang ()

       {

           // Tulis kode kustom Anda di sini untuk membuang objek apa pun jika diperlukan

       }

   }

Langkah selanjutnya adalah menggunakan modul HTTP khusus. Untuk melakukannya, buat proyek lain (kali ini, proyek aplikasi ASP.NET). Pertama, buat solusi dan tambahkan referensi ke modul HTTP khusus yang baru saja kita buat.

Selanjutnya, Anda perlu mendaftarkan modul HTTP khusus di file web.config. Cuplikan kode berikut menggambarkan bagaimana modul HTTP khusus dapat didaftarkan.

Dan, hanya itu yang perlu Anda lakukan untuk menggunakan modul HTTP kustom Anda.

Saat menggunakan modul HTTP sinkron, utas tidak akan dilepaskan sampai pemrosesan permintaan selesai. Ini bisa menjadi penghambat kinerja utama saat modul HTTP kustom Anda perlu menjalankan operasi terikat I / O yang berjalan lama. Untuk mengatasi ini, Anda dapat memanfaatkan pemrograman asinkron untuk mengimplementasikan modul HTTP asinkron juga. Ini akan memastikan bahwa kinerja aplikasi Anda tidak menurun ketika modul HTTP Anda perlu melakukan banyak pemrosesan. Pemrograman asinkron membantu penggunaan sumber daya yang tersedia dengan lebih baik.

Untuk mengimplementasikan asynchrony dalam modul HTTP kustom Anda, Anda ingin memanfaatkan kelas EventHandlerTaskAsyncHelper yang tersedia sebagai bagian dari .NET Framework 4.5. Cuplikan kode berikut menggambarkan bagaimana Anda dapat memanfaatkan kelas ini untuk berlangganan kejadian dalam metode Init pada modul HTTP khusus Anda. Perhatikan bahwa metode LogRequest harus mengembalikan contoh tipe Task.

public void Init (konteks HttpApplication)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = new EventHandlerTaskAsyncHelper (LogRequest);

           context.AddOnPostAuthorizeRequestAsync (asyncHelperObject.BeginEventHandler, asyncHelperObject.EndEventHandler);

       }

Berikut adalah daftar kode lengkap dari versi asynchronous modul HTTP kustom kami.

kelas publik CustomModule: IHttpModule

   {

       public void Init (konteks HttpApplication)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = new EventHandlerTaskAsyncHelper (LogRequest);

      context.AddOnPostAuthorizeRequestAsync (asyncHelperObject.BeginEventHandler, asyncHelperObject.EndEventHandler);

       }

       private async Task LogRequest (pengirim objek, EventArgs e)

       {

           Konteks HttpContext = ((HttpApplication) pengirim) .Context;

           string filePath = @ "D: \ Log.txt";

            menggunakan (StreamWriter streamWriter = StreamWriter baru (filePath, true))

           {

               menunggu streamWriter.WriteLineAsync (konteks.Request.Path);

           }

       }

   }

Cara melakukan lebih banyak di ASP.NET dan ASP.NET Core:

  • Cara menggunakan cache dalam memori di ASP.NET Core
  • Bagaimana menangani kesalahan di ASP.NET Web API
  • Cara meneruskan beberapa parameter ke metode pengontrol API Web
  • Cara log permintaan dan respons metadata di ASP.NET Web API
  • Cara bekerja dengan HttpModules di ASP.NET
  • Versi lanjutan dalam ASP.NET Core Web API
  • Cara menggunakan injeksi ketergantungan di ASP.NET Core
  • Cara bekerja dengan sesi di ASP.NET
  • Bagaimana bekerja dengan HTTPHandlers di ASP.NET
  • Cara menggunakan IHostedService di ASP.NET Core
  • Cara menggunakan layanan sabun WCF di ASP.NET Core
  • Cara meningkatkan kinerja aplikasi ASP.NET Core
  • Cara menggunakan ASP.NET Core Web API menggunakan RestSharp
  • Cara bekerja dengan masuk ke ASP.NET Core
  • Cara menggunakan MediatR di ASP.NET Core
  • Cara bekerja dengan status sesi di ASP.NET Core
  • Cara menggunakan Nancy di ASP.NET Core
  • Pahami pengikatan parameter di ASP.NET Web API
  • Cara mengupload file di ASP.NET Core MVC
  • Bagaimana menerapkan penanganan pengecualian global di ASP.NET Core Web API
  • Cara menerapkan pemeriksaan kesehatan di ASP.NET Core
  • Praktik terbaik dalam caching di ASP.NET
  • Cara menggunakan perpesanan Apache Kafka di .NET
  • Cara mengaktifkan CORS di API Web Anda
  • Kapan menggunakan WebClient vs. HttpClient vs. HttpWebRequest
  • Cara bekerja dengan Redis Cache di .NET
  • Kapan menggunakan Task.WaitAll vs. Task.WhenAll di .NET