Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Panduan ini menunjukkan cara menggunakan C++ untuk membuat sampel modul HTTP tingkat permintaan yang mengimplementasikan arsitektur pemrosesan permintaan baru di IIS 7. Arsitektur baru ini memperluas kemampuan pemrograman kode asli saat Anda menulis aplikasi IIS melalui versi modul HTTP ASP.NET yang lebih lama dan filter atau ekstensi ISAPI. Untuk informasi selengkapnya tentang mendesain modul HTTP menggunakan arsitektur pemrosesan permintaan baru, lihat Merancang modul HTTP Native-Code.
Dalam panduan ini, Anda akan membuat proyek C++ untuk modul HTTP Anda, menambahkan kode yang diperlukan untuk proyek "Halo Dunia", lalu mengkompilasi dan menguji modul.
Prasyarat
Perangkat lunak berikut diperlukan untuk menyelesaikan langkah-langkah dalam contoh:
IIS 7.
Visual Studio 2005.
Windows Software Development Kit (SDK).
Catatan Anda dapat menggunakan Visual Studio .NET 2003 atau yang lebih lama, meskipun langkah-langkah penelusuran mungkin tidak identik.
Membuat Modul
Di bagian panduan ini, Anda akan membuat proyek C++ DLL kosong untuk modul HTTP Anda.
Untuk membuat proyek C++ DLL baru
Buka Visual Studio 2005.
Verifikasi bahwa opsi global memiliki semua jalur yang tepat ke SDK termasuk file:
Di menu Alat, klik Opsi.
Perluas simpul Proyek dan Solusi dalam tampilan pohon, lalu klik Direktori VC++.
Dalam kotak drop-down Perlihatkan direktori untuk , pilih Sertakan file.
Verifikasi bahwa jalur tempat Anda menginstal file sertakan Windows SDK tercantum. Jika jalur tidak tercantum, klik ikon Baris Baru , lalu tambahkan jalur tempat Anda menginstal SDK menyertakan file. Direktori penginstalan default adalah $(VCInstallDir)PlatformSDK\bin.
Klik OK.
Buat proyek C++ baru:
Pada menu File, arahkan ke Baru, lalu klik Proyek.
Kotak dialog Proyek Baru terbuka.
Di panel Jenis Proyek , perluas simpul Visual C++ , lalu klik Win32.
Di panel Templat , pilih Proyek Win32.
Dalam kotak Nama , ketik HelloWorld.
Dalam kotak Lokasi , ketik jalur untuk sampel.
Klik OK.
Panduan Aplikasi Win32 terbuka.
Klik Pengaturan Aplikasi.
Di bawah Jenis aplikasi, klik DLL.
Di bawah Opsi tambahan, klik Kosongkan proyek.
Klik Selesai.
Menambahkan Kode dan File Sumber
Langkah selanjutnya adalah menambahkan file C++ dan definisi modul yang diperlukan ke proyek.
Untuk menambahkan file sumber ke proyek
Buat file definisi modul untuk mengekspor fungsi RegisterModule :
Di Penjelajah Solusi, klik kanan File Sumber, arahkan ke Tambahkan, lalu klik Item Baru.
Kotak dialog Tambahkan Item Baru terbuka.
Perluas simpul Visual C++ di panel Kategori , lalu klik Kode.
Di panel Templat , pilih templat File Definisi Modul .
Dalam kotak Nama , ketik HelloWorld, dan biarkan jalur default untuk file di kotak Lokasi .
Klik Tambahkan.
Tambahkan baris dengan
EXPORTS
danRegisterModule
. File Anda akan terlihat seperti kode di bawah ini:LIBRARY"HelloWorld" EXPORTS RegisterModule
Catatan
Alih-alih membuat file definisi modul, Anda dapat mengekspor fungsi RegisterModule dengan menggunakan sakelar /EXPORT:RegisterModule .
Buat file C++:
Di Penjelajah Solusi, klik kanan File Sumber, arahkan ke Tambahkan, lalu klik Item Baru.
Kotak dialog Tambahkan Item Baru terbuka.
Perluas simpul Visual C++ di panel Kategori , lalu klik Kode.
Di panel Templat , pilih templat File C++ .
Dalam kotak Nama , ketik HelloWorld, dan biarkan jalur default untuk file di kotak Lokasi .
Klik Tambahkan.
Tambahkan kode berikut:
#define _WINSOCKAPI_ #include <windows.h> #include <sal.h> #include <httpserv.h> // Create the module class. class CHelloWorld : public CHttpModule { public: REQUEST_NOTIFICATION_STATUS OnBeginRequest( IN IHttpContext * pHttpContext, IN IHttpEventProvider * pProvider ) { UNREFERENCED_PARAMETER( pProvider ); // Create an HRESULT to receive return values from methods. HRESULT hr; // Retrieve a pointer to the response. IHttpResponse * pHttpResponse = pHttpContext->GetResponse(); // Test for an error. if (pHttpResponse != NULL) { // Clear the existing response. pHttpResponse->Clear(); // Set the MIME type to plain text. pHttpResponse->SetHeader( HttpHeaderContentType,"text/plain", (USHORT)strlen("text/plain"),TRUE); // Create a string with the response. PCSTR pszBuffer = "Hello World!"; // Create a data chunk. HTTP_DATA_CHUNK dataChunk; // Set the chunk to a chunk in memory. dataChunk.DataChunkType = HttpDataChunkFromMemory; // Buffer for bytes written of data chunk. DWORD cbSent; // Set the chunk to the buffer. dataChunk.FromMemory.pBuffer = (PVOID) pszBuffer; // Set the chunk size to the buffer size. dataChunk.FromMemory.BufferLength = (USHORT) strlen(pszBuffer); // Insert the data chunk into the response. hr = pHttpResponse->WriteEntityChunks( &dataChunk,1,FALSE,TRUE,&cbSent); // Test for an error. if (FAILED(hr)) { // Set the HTTP status. pHttpResponse->SetStatus(500,"Server Error",0,hr); } // End additional processing. return RQ_NOTIFICATION_FINISH_REQUEST; } // Return processing to the pipeline. return RQ_NOTIFICATION_CONTINUE; } }; // Create the module's class factory. class CHelloWorldFactory : public IHttpModuleFactory { public: HRESULT GetHttpModule( OUT CHttpModule ** ppModule, IN IModuleAllocator * pAllocator ) { UNREFERENCED_PARAMETER( pAllocator ); // Create a new instance. CHelloWorld * pModule = new CHelloWorld; // Test for an error. if (!pModule) { // Return an error if the factory cannot create the instance. return HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY ); } else { // Return a pointer to the module. *ppModule = pModule; pModule = NULL; // Return a success status. return S_OK; } } void Terminate() { // Remove the class from memory. delete this; } }; // Create the module's exported registration function. HRESULT __stdcall RegisterModule( DWORD dwServerVersion, IHttpModuleRegistrationInfo * pModuleInfo, IHttpServer * pGlobalInfo ) { UNREFERENCED_PARAMETER( dwServerVersion ); UNREFERENCED_PARAMETER( pGlobalInfo ); // Set the request notifications and exit. return pModuleInfo->SetRequestNotifications( new CHelloWorldFactory, RQ_BEGIN_REQUEST, 0 ); }
Mengkompilasi dan Menguji Modul
Untuk mengkompilasi dan menguji proyek
Kompilasi modul HTTP:
Pada menu Build, klik Solusi Build.
Verifikasi bahwa Visual Studio tidak mengembalikan kesalahan atau peringatan apa pun.
Tambahkan modul HelloWorld.dll (dengan jalur lengkap) ke
globalModules
bagian %windir%\system32\inetsrv\config\applicationHost.config file.
Gunakan Internet Explorer untuk menelusuri situs Web Anda; Anda akan melihat "Mulai Sampel permintaan" dengan jumlah permintaan ditampilkan.
Catatan
Anda harus menghentikan IIS sebelum menautkan proyek Anda pada build berikutnya.
Pemecahan Masalah Pengaturan Anda
Jika modul Anda tidak dikompilasi atau tidak berfungsi seperti yang diharapkan, berikut adalah beberapa area yang dapat Anda periksa:
Pastikan Anda telah menentukan
__stdcall
untuk fungsi yang diekspor, atau Anda telah mengonfigurasi kompilasi dengan menggunakan__stdcall (/Gz)
konvensi panggilan.Pastikan IIS telah memuat HelloWorld.dll:
Di Manajer IIS, klik Situs Web Default di panel Koneksi .
Di ruang kerja (panel tengah), pilih Tampilan Fitur.
Dalam kotak Kelompokkan menurut , pilih Kategori.
Di kategori Komponen Server , klik dua kali Modul.
Verifikasi bahwa modul HelloWorld tercantum.
Pastikan Anda telah menambahkan ekspor yang benar
RegisterModule
ke file definisi Anda.Pastikan Anda telah menambahkan file definisi ke pengaturan proyek. Untuk menambahkan file ke pengaturan proyek, selesaikan langkah-langkah berikut:
Pada menu Proyek, klik Properti.
Perluas simpul Properti Konfigurasi dalam tampilan pohon, perluas simpul Linker , lalu klik Input.
Untuk pengaturan File Definisi Modul , pastikan file definisi Anda tercantum.
Lihat juga
Membuat Modul HTTP Native-Code
Merancang Modul HTTP Native-Code