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.
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:
Modul mendaftar untuk pemberitahuan RQ_MAP_PATH .
Modul membuat kelas CHttpModule yang berisi metode OnMapPath dan OnAsyncCompletion .
Saat klien Web meminta URL, IIS memanggil metode modul
OnMapPath. Metode ini melakukan tugas-tugas berikut: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::CloneContextmetode untuk membuat klon permintaan saat ini.Memanggil metode kloning
IHttpRequest::SetUrluntuk mengatur URL untuk kloning ke /example/default.aspx.ExecuteRequestMemanggil metode untuk menjalankan permintaan anak.Pengujian untuk penyelesaian asinkron. Jika penyelesaian asinkron tertunda, modul mengembalikan pemrosesan ke alur pemrosesan permintaan terintegrasi. Jika tidak, modul merilis konteks kloning.
Jika penyelesaian asinkron diperlukan, IIS memanggil metode modul
OnAsyncCompletion. Metode ini merilis konteks kloning.Modul menghapus
CHttpModulekelas 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