Cara bekerja dengan HttpModules di ASP.NET

Terdapat dua cara di mana anda dapat menyuntik logik dalam saluran permintaan aplikasi ASP.NET - HttpHandlers dan HttpModules. HttpModule adalah komponen yang merupakan sebahagian dari saluran pemprosesan permintaan ASP.NET dan dipanggil pada setiap permintaan yang dibuat untuk aplikasi anda.

Perhatikan bahawa HttpModules dapat mengakses peristiwa kitaran hidup permintaan dan oleh itu ia dapat digunakan untuk mengubah respons juga. Modul Http umumnya digunakan untuk memasukkan masalah silang seperti keselamatan, pembalakan, dan lain-lain dalam saluran pemprosesan permintaan dan juga dapat digunakan untuk menulis semula URL dan bahkan untuk membuat tajuk khusus dalam respons.

Seperti yang dinyatakan oleh dokumentasi Microsoft, “Modul HTTP adalah kumpulan yang dipanggil pada setiap permintaan yang dibuat untuk aplikasi Anda. Modul HTTP dipanggil sebagai sebahagian daripada saluran permintaan ASP.NET dan mempunyai akses ke peristiwa kitaran hidup sepanjang permintaan. Modul HTTP memungkinkan anda memeriksa permintaan masuk dan keluar dan mengambil tindakan berdasarkan permintaan tersebut. "

Untuk membuat HttpModule tersuai, anda harus membuat kelas yang melaksanakan antara muka System.Web.IHttpModule. Untuk membuat HttpModule, ikuti langkah berikut:

  1. Buka Visual Studio IDE
  2. Klik pada Fail-> Projek Baru
  3. Buat projek perpustakaan kelas
  4. Tambahkan rujukan untuk pemasangan System.Web untuk projek ini
  5. Seterusnya, buat kelas di dalam projek ini yang menerapkan antara muka IHttpModule
  6. Tulis pengendali untuk kaedah Init untuk memulakan modul anda dan melanggan satu atau lebih acara
  7. Sebagai pilihan, laksanakan kaedah Buang dalam modul khusus anda

Pada pandangan pertama, HttpModule tersuai kami kelihatan seperti ini:

kelas awam CustomHttpModule: IHttpModule

   {

       kekosongan awam Buang ()

       {

           membuang NotImplementedException baru ();

       }

       awam tidak sah Init (HttpApplication konteks)

       {

           membuang NotImplementedException baru ();

       }

   }

Coretan kod berikut menunjukkan bagaimana anda boleh melanggan acara dalam modul HTTP tersuai anda.

awam tidak sah Init (HttpApplication konteks)

       {

           konteks.BeginRequest + = EventHandler baru (OnBeginRequest);

           konteks.EndRequest + = EventHandler baru (OnEndRequest);            

           konteks.LogRequest + = EventHandler baru (OnLogRequest);

       }

Mari sekarang tulis kod untuk kaedah OnLogRequest. Kaedah ini bertujuan untuk mencatat jalan atau setiap permintaan ke fail teks. Inilah cara kaedah OnLogRequest:

kekosongan awam OnLogRequest (pengirim objek, EventArgs e)

       {

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

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

           menggunakan (StreamWriter streamWriter = StreamWriter baru (filePath))

           {

               streamWriter.WriteLine (konteks.Request.Path);

           }

       }

Penyenaraian kod berikut menggambarkan modul HTTP khusus yang lengkap.

kelas awam CustomModule: IHttpModule

   {

       awam tidak sah Init (HttpApplication konteks)

       {

           konteks.BeginRequest + = EventHandler baru (OnBeginRequest);

           konteks.EndRequest + = EventHandler baru (OnEndRequest);          

           konteks.LogRequest + = EventHandler baru (OnLogRequest);

       }

       void awam OnLogRequest (penghantar objek, EventArgs e)

       {

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

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

           menggunakan (StreamWriter streamWriter = StreamWriter baru (filePath))

           {

               streamWriter.WriteLine (konteks.Request.Path);

           }

       }

       kekosongan awam OnBeginRequest (pengirim objek, EventArgs e)

       {

           // Tuliskan kod tersuai anda di sini

       }

       kekosongan awam OnEndRequest (pengirim objek, EventArgs e)

       {

           // Tuliskan kod tersuai anda di sini

       }

       kekosongan awam Buang ()

       {

           // Tuliskan kod tersuai anda di sini untuk membuang objek jika diperlukan

       }

   }

Langkah seterusnya adalah menggunakan modul HTTP khusus. Untuk melakukan ini, buat projek lain (kali ini, projek aplikasi ASP.NET). Pertama, bina penyelesaian dan tambahkan rujukan ke modul HTTP tersuai yang baru kita buat.

Seterusnya, anda perlu mendaftarkan modul HTTP tersuai dalam fail web.config. Coretan kod berikut menggambarkan bagaimana modul HTTP tersuai dapat didaftarkan.

Dan, itu sahaja yang perlu anda lakukan untuk menggunakan modul HTTP tersuai anda.

Semasa menggunakan modul HTTP segerak, utas tidak akan dilepaskan sehingga pemprosesan permintaan selesai. Ini boleh menjadi hambatan prestasi utama apabila modul HTTP tersuai anda perlu melakukan operasi terikat I / O yang lama. Untuk menyelesaikannya, anda boleh memanfaatkan pengaturcaraan tak segerak untuk melaksanakan modul HTTP tak segerak juga. Ini akan memastikan bahawa prestasi aplikasi anda tidak merosot apabila modul HTTP anda perlu melakukan banyak proses. Pengaturcaraan tak segerak membantu penggunaan sumber yang ada dengan lebih baik.

Untuk melaksanakan asinkron dalam modul HTTP tersuai anda, anda ingin memanfaatkan kelas EventHandlerTaskAsyncHelper yang tersedia sebagai sebahagian daripada .NET Framework 4.5. Coretan kod berikut menggambarkan bagaimana anda dapat memanfaatkan kelas ini untuk melanggan acara dalam kaedah Init modul HTTP tersuai anda. Perhatikan bahawa kaedah LogRequest harus mengembalikan contoh jenis Tugas.

awam tidak sah Init (HttpApplication konteks)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = baru EventHandlerTaskAsyncHelper (LogRequest);

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

       }

Berikut adalah senarai kod lengkap dari versi HTTP tersuai kami yang tidak segerak.

kelas awam CustomModule: IHttpModule

   {

       awam tidak sah Init (HttpApplication konteks)

       {

           EventHandlerTaskAsyncHelper asyncHelperObject = baru EventHandlerTaskAsyncHelper (LogRequest);

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

       }

       Task LogRequest async peribadi (penghantar objek, EventArgs e)

       {

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

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

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

           {

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

           }

       }

   }

Cara melakukan lebih banyak perkara dalam ASP.NET dan ASP.NET Core:

  • Cara menggunakan cache dalam memori di ASP.NET Core
  • Cara menangani ralat dalam API Web ASP.NET
  • Cara menyampaikan beberapa parameter ke kaedah pengawal API Web
  • Cara log metadata permintaan dan respons di API Web ASP.NET
  • Cara bekerja dengan HttpModules di ASP.NET
  • Versi lanjutan dalam ASP.NET Core Web API
  • Cara menggunakan suntikan kebergantungan dalam ASP.NET Core
  • Cara bekerja dengan sesi di ASP.NET
  • Cara bekerja dengan HTTPHandlers di ASP.NET
  • Cara menggunakan IHostedService dalam ASP.NET Core
  • Cara menggunakan perkhidmatan WCF SOAP di ASP.NET Core
  • Cara meningkatkan prestasi aplikasi ASP.NET Core
  • Cara menggunakan API Web Teras ASP.NET menggunakan RestSharp
  • Cara bekerja dengan log masuk di ASP.NET Core
  • Cara menggunakan MediatR dalam ASP.NET Core
  • Cara bekerja dengan keadaan sesi di ASP.NET Core
  • Cara menggunakan Nancy di ASP.NET Core
  • Fahami pengikatan parameter dalam ASP.NET Web API
  • Cara memuat naik fail dalam ASP.NET Core MVC
  • Cara melaksanakan pengendalian pengecualian global dalam ASP.NET Core Web API
  • Cara melaksanakan pemeriksaan kesihatan di ASP.NET Core
  • Amalan terbaik dalam membuat cache di ASP.NET
  • Cara menggunakan pesanan Apache Kafka di .NET
  • Cara mengaktifkan CORS pada API Web anda
  • Bila hendak menggunakan WebClient vs. HttpClient vs. HttpWebRequest
  • Cara bekerjasama dengan Redis Cache di .NET
  • Bila hendak menggunakan Task.WaitAll vs. Task.WhenAll in .NET