Bagikan melalui


IHttpContext::ExecuteRequest Method

Menjalankan permintaan anak.

Sintaks

virtual HRESULT ExecuteRequest(  
   IN BOOL fAsync,  
   IN IHttpContext* pHttpContext,  
   IN DWORD dwExecuteFlags,  
   IN IHttpUser* pHttpUser,  
   OUT BOOL* pfCompletionExpected = NULL  
) = 0;  

Parameter

fAsync
[IN] Selalu true (menentukan eksekusi asinkron).

pHttpContext
[IN] Penunjuk ke IHttpContext anak untuk dijalankan.

dwExecuteFlags
[IN] DWORD yang berisi bendera eksekusi permintaan.

pHttpUser
[IN] Penunjuk ke IHttpUser untuk permintaan tersebut. (Opsional)

pfCompletionExpected
[OUT] true jika penyelesaian asinkron masih tertunda; jika tidak, false. (Opsional)

Tampilkan Nilai

Sebuah HRESULT. Nilai yang mungkin termasuk, tetapi tidak terbatas pada, yang ada dalam tabel berikut.

Nilai Deskripsi
S_OK Menunjukkan bahwa operasi berhasil.
ERROR_NOT_SUPPORTED Menunjukkan bahwa permintaan tidak didukung (misalnya, fAsync diatur ke false atau permintaan anak tidak dikloning dari permintaan induk).
ERROR_STACK_OVERFLOW Menunjukkan bahwa permintaan melebihi batas untuk permintaan anak rekursif.

Keterangan

Metode ExecuteRequest menjalankan permintaan anak yang ditentukan oleh antarmuka IHttpContext dalam pHttpContext parameter . Anda harus membuat konteks permintaan ini dengan menggunakan metode IHttpContext::CloneContext .

Penting

Mencoba menjalankan permintaan anak yang tidak dikloning oleh permintaan induk akan mengembalikan ERROR_NOT_SUPPORTED.

Setiap konteks anak hanya dapat dijalankan sekali, meskipun permintaan anak dapat disarangkan secara rekursif.

Catatan

Batas untuk permintaan anak rekursif adalah 10.

Metode ini ExecuteRequest hanya mendukung operasi asinkron, yang mencegah kelelahan kumpulan utas.

Penting

Mencoba menjalankan permintaan anak sinkron akan mengembalikan ERROR_NOT_SUPPORTED.

Anda dapat mengontrol perilaku eksekusi untuk permintaan anak dengan menentukan bendera eksekusi di dwExecuteFlags. Tabel berikut ini mencantumkan nilai yang mungkin untuk bendera ini.

Nilai Deskripsi
EXECUTE_FLAG_NO_HEADERS Tekan header HTTP untuk permintaan anak.
EXECUTE_FLAG_IGNORE_CURRENT_INTERCEPTOR Abaikan penanganan peta skrip saat ini untuk rantai permintaan ini.
EXECUTE_FLAG_IGNORE_APPPOOL Jalankan permintaan meskipun permintaan anak tidak berada di kumpulan aplikasi yang sama.
EXECUTE_FLAG_DISABLE_CUSTOM_ERROR Nonaktifkan kesalahan kustom untuk permintaan anak.
EXECUTE_FLAG_SAME_URL URL untuk permintaan anak sama dengan permintaan induk. Catatan: Penangan peta skrip menggunakan bendera ini untuk meneruskan eksekusi.
EXECUTE_FLAG_BUFFER_RESPONSE Jangan membersihkan respons anak; mengembalikan respons ke permintaan induk.
EXECUTE_FLAG_HTTP_CACHE_ELIGIBLE Respons anak masih memenuhi syarat untuk penembolokan dengan Http.sys. Catatan: Penembolokan dinonaktifkan secara default saat permintaan anak dijalankan.

Jika Anda menentukan IHttpUser antarmuka untuk pHttpUser, autentikasi akan dilewati untuk permintaan anak.

Contoh

Contoh kode berikut menunjukkan cara membuat modul HTTP yang melakukan tugas berikut:

  1. Modul mendaftar untuk pemberitahuan RQ_MAP_PATH .

  2. Modul membuat kelas CHttpModule yang berisi metode OnMapPath dan OnAsyncCompletion .

  3. Saat klien Web meminta URL, IIS memanggil metode modul OnMapPath . Metode ini melakukan tugas-tugas berikut:

    1. Pengujian untuk melihat apakah URL untuk permintaan saat ini cocok dengan dua URL tertentu di akar situs Web. Jika URL cocok dengan salah satu URL yang ditentukan, modul menggunakan IHttpContext::CloneContext metode untuk membuat klon permintaan saat ini.

    2. Memanggil metode kloning IHttpRequest::SetUrl untuk mengatur URL untuk kloning ke /example/default.aspx.

    3. ExecuteRequest Memanggil metode untuk menjalankan permintaan anak.

    4. Pengujian untuk penyelesaian asinkron. Jika penyelesaian asinkron tertunda, modul mengembalikan pemrosesan ke alur pemrosesan permintaan terintegrasi. Jika tidak, modul merilis konteks kloning.

  4. Jika penyelesaian asinkron diperlukan, IIS memanggil metode modul OnAsyncCompletion . Metode ini merilis konteks kloning.

  5. Modul menghapus CHttpModule kelas dari memori lalu keluar.

#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>

// Create the module class.
class MyHttpModule : public CHttpModule
{

private:

    // Create a pointer for a child request.
    IHttpContext * m_pChildRequestContext;

public:

    MyHttpModule(void)
    {
        m_pChildRequestContext = NULL;
    }

    REQUEST_NOTIFICATION_STATUS
    OnMapPath(
        IN IHttpContext * pHttpContext,
        IN IMapPathProvider * pProvider
    )
    {
        UNREFERENCED_PARAMETER( pProvider );

        HRESULT hr;
        BOOL fCompletionExpected;

        // Retrieve a pointer to the URL.
        PCWSTR pwszUrl = pProvider->GetUrl();

        // Only process requests for the root.
        if (0 == wcscmp(pwszUrl,L"/") || 0 == wcscmp(pwszUrl,L"/default.aspx"))
        {            
            // Clone the current context.
            hr = pHttpContext->CloneContext(
                CLONE_FLAG_BASICS, &m_pChildRequestContext );
            
            // Test for a failure.
            if (FAILED(hr))
            {
                goto Failure;
            }
            
            // Test for an error.
            if ( NULL != m_pChildRequestContext )
            {
                // Set the URL for the child request.
                hr = m_pChildRequestContext->GetRequest()->SetUrl(
                    "/example/default.aspx",
                    (DWORD)strlen("/example/default.aspx"),false);
            
                // Test for a failure.
                if (FAILED(hr))
                {
                    goto Failure;
                }
                
                // Execute the child request.
                hr = pHttpContext->ExecuteRequest(
                    TRUE, m_pChildRequestContext,
                    0, NULL, &fCompletionExpected );
                
                // Test for a failure.
                if (FAILED(hr))
                {
                    goto Failure;
                }
                
                // Test for pending asynchronous operations.
                if (fCompletionExpected)
                {
                    return RQ_NOTIFICATION_PENDING;
                }

            }

 Failure:
            // Test for a child request.
            if (NULL != m_pChildRequestContext)
            {
                // Release the child request.
                m_pChildRequestContext->ReleaseClonedContext();
                m_pChildRequestContext = NULL;
            }
        }
        
        // Return processing to the pipeline.
        return RQ_NOTIFICATION_CONTINUE;
    }
    
    REQUEST_NOTIFICATION_STATUS
        OnAsyncCompletion(
        IN IHttpContext * pHttpContext,
        IN DWORD dwNotification,
        IN BOOL fPostNotification,
        IN IHttpEventProvider * pProvider,
        IN IHttpCompletionInfo * pCompletionInfo
        )
    {
        // Test for a child request.
        if (NULL != m_pChildRequestContext)
        {
            // Release the child request.
            m_pChildRequestContext->ReleaseClonedContext();
            m_pChildRequestContext = NULL;
        }
        // Return processing to the pipeline.
        return RQ_NOTIFICATION_CONTINUE;
    }

};

// Create the module's class factory.
class MyHttpModuleFactory : public IHttpModuleFactory
{
public:
    HRESULT
    GetHttpModule(
        OUT CHttpModule ** ppModule, 
        IN IModuleAllocator * pAllocator
    )
    {
        UNREFERENCED_PARAMETER( pAllocator );

        // Create a new instance.
        MyHttpModule * pModule = new MyHttpModule;

        // Test for an error.
        if (!pModule)
        {
            // Return an error if we 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 );

    return pModuleInfo->SetRequestNotifications(
        new MyHttpModuleFactory,
        RQ_MAP_PATH,
        0
    );
}

Modul Anda harus mengekspor fungsi RegisterModule . 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

Antarmuka IHttpContext
Metode IHttpContext::CloneContext
Metode IHttpContext::GetParentContext
Metode IHttpContext::ReleaseClonedContext