Bagikan melalui


Kelas CHttpModule

Menentukan kelas dasar untuk modul HTTP tingkat permintaan.

Sintaks

class CHttpModule  

Metode

Tabel berikut mencantumkan metode yang diekspos oleh CHttpModule kelas .

Nama Deskripsi
~CHttpModule Membatalkan alokasi instans CHttpModule kelas.
CHttpModule Menginisialisasi instans baru kelas CHttpModule.
Dispose Merilis semua sumber daya yang digunakan oleh instans CHttpModule kelas saat ini.
OnAcquireRequestState Mewakili metode yang akan menangani AcquireRequestState peristiwa, yang terjadi ketika IIS mengambil status untuk permintaan saat ini.
OnAsyncCompletion Mewakili metode yang akan menangani peristiwa penyelesaian asinkron, yang terjadi setelah operasi asinkron selesai diproses.
OnAuthenticateRequest Mewakili metode yang akan menangani AuthenticateRequest peristiwa, yang terjadi ketika IIS menetapkan identitas pengguna.
OnAuthorizeRequest Mewakili metode yang akan menangani AuthorizeRequest peristiwa, yang terjadi ketika IIS memverifikasi otorisasi pengguna.
OnBeginRequest Mewakili metode yang akan menangani BeginRequest peristiwa, yang terjadi sebagai peristiwa pertama dalam alur pemrosesan permintaan terintegrasi HTTP untuk permintaan saat ini.
OnCustomRequestNotification Mewakili metode yang akan menangani peristiwa kustom, yang terjadi saat modul menaikkan pemberitahuan yang ditentukan pengguna.
OnEndRequest Mewakili metode yang akan menangani EndRequest peristiwa, yang terjadi sebagai peristiwa terakhir dalam alur pemrosesan permintaan terintegrasi HTTP untuk permintaan saat ini.
OnExecuteRequestHandler Mewakili metode yang akan menangani ExecuteRequestHandler peristiwa, yang terjadi ketika IIS menjalankan handler untuk permintaan saat ini.
OnLogRequest Mewakili metode yang akan menangani LogRequest peristiwa, yang terjadi ketika IIS bersiap untuk mencatat permintaan saat ini.
OnMapPath Mewakili metode yang akan menangani MapPath peristiwa, yang terjadi ketika operasi meminta jalur fisik untuk dipetakan untuk permintaan saat ini.
OnMapRequestHandler Mewakili metode yang akan menangani MapRequestHandler peristiwa, yang terjadi ketika IIS memetakan permintaan saat ini ke penanganan aktivitas.
OnPostAcquireRequestState Mewakili metode yang akan menangani AcquireRequestState pasca-peristiwa, yang terjadi setelah IIS mengambil status untuk permintaan saat ini.
OnPostAuthenticateRequest Mewakili metode yang akan menangani AuthenticateRequest pasca-peristiwa, yang terjadi setelah IIS menetapkan identitas pengguna.
OnPostAuthorizeRequest Mewakili metode yang akan menangani AuthorizeRequest pasca-peristiwa, yang terjadi setelah IIS telah memverifikasi otorisasi pengguna.
OnPostBeginRequest Mewakili metode yang akan menangani BeginRequest pasca-peristiwa, yang terjadi setelah peristiwa pertama dalam alur pemrosesan permintaan terintegrasi HTTP.
OnPostEndRequest Mewakili metode yang akan menangani EndRequest pasca-peristiwa, yang terjadi setelah peristiwa terakhir dalam alur pemrosesan permintaan terintegrasi HTTP untuk permintaan saat ini.
OnPostExecuteRequestHandler Mewakili metode yang akan menangani ExecuteRequestHandler pasca-peristiwa, yang terjadi setelah IIS menjalankan handler untuk permintaan saat ini.
OnPostLogRequest Mewakili metode yang akan menangani LogRequest pasca-peristiwa, yang terjadi setelah IIS mencatat permintaan saat ini.
OnPostMapRequestHandler Mewakili metode yang akan menangani MapRequestHandler pasca-peristiwa, yang terjadi setelah IIS memetakan permintaan saat ini ke penanganan aktivitas yang sesuai.
OnPostPreExecuteRequestHandler Mewakili metode yang akan menangani PreExecuteRequestHandler pasca-peristiwa, yang terjadi sebelum IIS menjalankan handler permintaan.
OnPostReleaseRequestState Mewakili metode yang akan menangani ReleaseRequestState pasca-peristiwa, yang terjadi setelah status saat ini dirilis.
OnPostResolveRequestCache Mewakili metode yang akan menangani ResolveRequestCache pasca-peristiwa, yang terjadi setelah IIS menyelesaikan permintaan dari cache.
OnPostUpdateRequestCache Mewakili metode yang akan menangani UpdateRequestCache pasca-peristiwa, yang terjadi setelah IIS menyimpan permintaan di cache.
OnPreExecuteRequestHandler Mewakili metode yang akan menangani PreExecuteRequestHandler peristiwa, yang terjadi sebelum IIS menjalankan handler permintaan.
OnReadEntity Mewakili metode yang akan menangani ReadEntity peristiwa, yang terjadi ketika operasi membaca data dari buffer permintaan.
OnReleaseRequestState Mewakili metode yang akan menangani ReleaseRequestState peristiwa, yang terjadi ketika status saat ini dirilis.
OnResolveRequestCache Mewakili metode yang akan menangani ResolveRequestCache peristiwa, yang terjadi ketika IIS menyelesaikan permintaan dalam cache.
OnSendResponse Mewakili metode yang akan menangani SendResponse peristiwa, yang terjadi ketika IIS mengirim buffer respons.
OnUpdateRequestCache Mewakili metode yang akan menangani UpdateRequestCache peristiwa, yang terjadi ketika IIS menyimpan permintaan dalam cache.

Kelas Turunan

Kelas ini tidak berisi kelas turunan.

Keterangan

Kelas CHttpModule adalah kelas dasar untuk modul HTTP tingkat permintaan. Untuk membuat CHttpModulekelas -turunan, Anda perlu membuat modul HTTP tingkat permintaan yang berisi kelas yang mewarisi dari CHttpModule dan kelas yang berasal dari antarmuka IHttpModuleFactory . Untuk informasi selengkapnya tentang membuat modul HTTP, lihat Merancang modul HTTP Native-Code.

Kelas ini CHttpModule menyediakan metode konstruktor dan destruktor yang dilindungi dan metode publik Dispose . Pada akhir permintaan, Dispose metode dipanggil untuk menghapus instans CHttpModulekelas -turunan.

Kelas ini CHttpModule juga menentukan metode khusus pemberitahuan yang dipanggil IIS 7 saat memproses peristiwa tingkat permintaan dalam alur pemrosesan permintaan terintegrasi. Modul HTTP dapat mendaftar untuk peristiwa tertentu dengan menentukan daftar pemberitahuan dalam fungsi RegisterModule modul yang diekspor.

Peristiwa permintaan deterministik

Sebagian besar metode pemberitahuan tingkat permintaan diproses secara kronologis selama alur normal peristiwa tingkat permintaan dalam alur terintegrasi. Setiap metode pemberitahuan tingkat permintaan deterministik memiliki pemberitahuan pasca-peristiwa yang cocok, yang memungkinkan modul HTTP untuk memproses ketika suatu peristiwa terjadi atau segera setelah peristiwa terjadi.

Tabel berikut mencantumkan peristiwa tingkat permintaan kronologis dan metode pemberitahuan pasca-peristiwa dalam urutan kemunculannya dalam alur terintegrasi.

Metode pemberitahuan peristiwa Metode pemberitahuan pasca-peristiwa
OnBeginRequest OnPostBeginRequest
OnAuthenticateRequest OnPostAuthenticateRequest
OnAuthorizeRequest OnPostAuthorizeRequest
OnResolveRequestCache OnPostResolveRequestCache
OnMapRequestHandler OnPostMapRequestHandler
OnAcquireRequestState OnPostAcquireRequestState
OnPreExecuteRequestHandler OnPostPreExecuteRequestHandler
OnExecuteRequestHandler OnPostExecuteRequestHandler
OnReleaseRequestState OnPostReleaseRequestState
OnUpdateRequestCache OnPostUpdateRequestCache
OnLogRequest OnPostLogRequest
OnEndRequest OnPostEndRequest

Misalnya, OnBeginRequest terjadi sebelum OnAuthenticateRequest, OnMapRequestHandler terjadi sebelum OnAcquireRequestState, dan sebagainya.

Catatan

Pemberitahuan pasca-peristiwa terjadi sebelum pemberitahuan tingkat permintaan kronologis berikutnya. Misalnya, OnPostAuthenticateRequest terjadi sebelum OnAuthorizeRequest, OnPostUpdateRequestCache terjadi sebelum OnLogRequest, dan sebagainya.

Peristiwa permintaan nondeterministik

Metode pemberitahuan tingkat permintaan yang tersisa tidak diproses dalam urutan tertentu; sebaliknya, IIS memproses peristiwa ini ketika peristiwa nondeterministik tertentu terjadi. Tabel berikut mencantumkan peristiwa tingkat permintaan nondeterministik dan metode pemberitahuan pasca-peristiwa terkait.

Metode pemberitahuan peristiwa Metode pemberitahuan pasca-peristiwa
OnAsyncCompletion (Tidak ada) 1
OnCustomRequestNotification (Tidak Ada) 2
OnMapPath (Tidak Ada)
OnReadEntity (Tidak Ada)
OnSendResponse (Tidak Ada)

1 Metode OnAsyncCompletion ini dipanggil ketika peristiwa asinkron terjadi dalam modul HTTP. Dengan demikian, Anda tidak dapat mendaftar untuk pemberitahuan asinkron dengan menggunakan fungsi RegisterModule modul yang diekspor. Sebagai gantinya, modul Anda akan menyediakan OnAsyncCompletion metode untuk memproses pemberitahuan yang terjadi setelah memanggil metode yang kembali secara asinkron (misalnya, metode IHttpContext::ExecuteRequest dan IHttpResponse::WriteEntityChunks ). Ketika IIS memanggil OnAsyncCompletion, metode akan meneruskan parameter yang menunjukkan jenis pemberitahuan dan apakah pemberitahuan tersebut untuk peristiwa atau pasca-peristiwa.

2 Metode OnCustomRequestNotification ini tidak memiliki metode pemberitahuan pasca-peristiwa yang sesuai. Modul HTTP dapat mendaftar untuk pemberitahuan kustom dengan menggunakan fungsi modul yang diekspor RegisterModule , tetapi modul tidak dapat mendaftar untuk pemberitahuan yang terjadi setelah pemberitahuan kustom terjadi.

Contoh

Contoh berikut menunjukkan cara membuat modul HTTP "Halo Dunia" sederhana. Modul menentukan fungsi yang diekspor yang meneruskan RegisterModule instans IHttpModuleFactory antarmuka ke metode IHttpModuleRegistrationInfo::SetRequestNotifications dan mendaftar untuk pemberitahuan RQ_BEGIN_REQUEST . IIS menggunakan metode IHttpModuleFactory::GetHttpModule untuk membuat contoh CHttpModule kelas dan mengembalikan status keberhasilan. IIS juga menggunakan metode IHttpModuleFactory::Terminate untuk menghapus pabrik dari memori.

Ketika pemberitahuan RQ_BEGIN_REQUEST terjadi, IIS memanggil metode modul OnBeginRequest untuk memproses permintaan saat ini. OnBeginRequest menghapus buffer respons dan memodifikasi jenis MIME untuk respons. Metode ini kemudian membuat gugus data yang berisi string "Halo Dunia" dan mengembalikan string ke klien Web. Terakhir, modul mengembalikan indikator status yang memberi tahu IIS bahwa semua pemberitahuan selesai lalu keluar.

#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
    );
}

Modul Anda harus mengekspor RegisterModule fungsi. Anda dapat mengekspor fungsi ini dengan membuat file definisi modul (.def) untuk proyek Anda, atau Anda dapat mengkompilasi modul dengan menggunakan sakelar /EXPORT:RegisterModule . Untuk informasi selengkapnya, lihat Panduan: Membuat Modul HTTP Request-Level Dengan Menggunakan Kode Asli.

Anda dapat secara opsional mengkompilasi kode dengan menggunakan __stdcall (/Gz) konvensi panggilan alih-alih secara eksplisit mendeklarasikan konvensi panggilan untuk setiap fungsi.

Persyaratan

Jenis Deskripsi
Klien - IIS 7.0 di Windows Vista
- IIS 7.5 di Windows 7
- IIS 8.0 di Windows 8
- IIS 10.0 pada Windows 10
Server - IIS 7.0 di Windows Server 2008
- IIS 7.5 di Windows Server 2008 R2
- IIS 8.0 di Windows Server 2012
- IIS 8.5 di Windows Server 2012 R2
- IIS 10.0 di Windows Server 2016
Produk - IIS 7.0, IIS 7.5, IIS 8.0, IIS 8.5, IIS 10.0
- IIS Express 7.5, IIS Express 8.0, IIS Express 10.0
Header Httpserv.h

Lihat juga

Membuat Modul HTTP Native-Code
Kelas CGlobalModule