共用方式為


WinHTTP 中的 HINTERNET 句柄

Microsoft Windows HTTP 服務 (WinHTTP) 會使用句柄來追蹤使用 HTTP 通訊協定時所需的設定和資訊。 每個句柄都會維護 HTTP 會話、與 HTTP 伺服器的連線,或特定資源的相關信息。 本主題描述各種類型的句柄、這些句柄的命名慣例,以及其階層式結構。

關於 HINTERNET 句柄

WinHTTP 所建立及使用的句柄稱為 HINTERNET 句柄。 WinHTTP 函式會傳回 HINTERNET 無法與其他句柄互換的句柄,因此無法與 ReadFile或 closeHandle等函式搭配使用。 同樣地,其他句柄無法與 WinHTTP 函式搭配使用。 例如,CreateFile 傳回的句柄無法傳遞至 winHttpReadData。 當使用句柄的 API 呼叫進行時,這些 HINTERNET 句柄無法關閉。 為了避免競爭狀況,只要 API 呼叫正在進行中,應用程式應該保護句柄並防止它關閉。

Microsoft Win32 因特網 (WinInet) 函式也會使用 HINTERNET 句柄。 不過,WinInet 函式中使用的句柄無法與 WinHTTP 函式中使用的句柄交換。 如需 WinInet 的詳細資訊,請參閱 關於 WinINet

WinHttpCloseHandle 函式會關閉 WinHTTP HINTERNET 句柄。

命名句柄

在 WinHTTP 檔中,應用程式程式設計介面 (API) 和範例程式代碼中的函式描述會顯示建立和使用不同類型的 HINTERNET 句柄。 若要追蹤可用的不同句柄類型,這些句柄的命名是一致的。 下表顯示檔中慣例所使用的標識碼。

句柄類型 函式建立句柄 標識碼
泛型句柄 WinHttpOpenWinHttpConnectWinHttpOpenRequest hInternet
會話句柄 WinHttpOpen hSession
連接句柄 WinHttpConnect hConnect
要求句柄 WinHttpOpenRequest hRequest
Web 套接字句柄 WinHttpWebSocketCompleteUpgrade hWebSocket

處理階層

HINTERNET 句柄會在階層中維護。 WinHttpOpen 所傳回的句柄是 HINTERNET 句柄 工作階段。 呼叫 WinHttpOpen 會初始化 WinHTTP 函式,並開始會話內容,在會話句柄的整個生命週期中維護使用者資訊和設定。 WinHttpConnect 指定目標 HTTP 或 HTTPS 伺服器,並建立 HINTERNET 句柄的連線。 根據預設,連接句柄會繼承會話句柄的設定。 在 HINTERNET 句柄 要求 WinHttpOpenRequest 指定每個資源。

下圖說明 HINTERNET 句柄 階層。 圖表中的每個方塊都代表 WinHTTP 函式,此函式會傳回 HINTERNET 句柄。

建立句柄的 函式

關閉句柄之後,應用程式必須準備好在句柄上接收回呼通知,直到最後一個 WINHTTP_CALLBACK_STATUS_HANDLE_CLOSED 值傳回,以指出句柄已完全關閉(或直到應用程式執行自己的對等同步處理,例如追蹤和等候擱置異步作的任何回呼,並確保不會再使用該句柄嘗試任何作業)。

會話句柄稱為用來建立的任何連接句柄的父代;同樣地,連接句柄和其父會話句柄都是連接句柄用來建立之任何要求句柄的父代。

當父句柄關閉時,即使它本身未關閉,其任何子系都會間接失效,且後續使用它們的要求會失敗,錯誤 ERROR_INVALID_HANDLE。 暫止的異步要求無法依賴以正確完成。

下圖顯示使用 WinHttpOpenRequest所建立 HINTERNET 句柄的函式。 陰影方塊代表建立句柄的 WinHTTP 函式,而純文字方塊會顯示使用這些 HINTERNET 句柄的函式。 此圖表也會組織來顯示通常呼叫 WinHTTP 函式的順序。

建立句柄的 函式

句柄階層的說明

首先,使用 WinHttpOpen建立會話句柄。 WinHttpConnect 需要會話句柄做為其第一個參數,並傳回指定伺服器的連線句柄。 要求句柄是由 WinHttpOpenRequest所建立,它會使用由 WinHttpConnect所建立的連接句柄。 如果應用程式選擇將其他標頭新增至要求,或應用程式必須設定驗證的認證,WinHttpAddRequestHeadersWinHttpSetCredentials 可以使用此要求句柄呼叫。 要求是由使用要求句柄的 winHttpSendRequest傳送。 傳送要求之後,可以使用 WinHttpWriteData傳送其他數據至伺服器,或應用程式可以直接跳至 WinHttpReceiveResponse,以指定不會傳送其他資訊給伺服器。 此時,視應用程式的目的而定,要求句柄可用來呼叫 winHttpQueryHeadersWinHttpQueryAuthSchemesWinHttpQueryHeaders,或擷取具有 WinHttpQueryDataAvailableWinHttpReadData的資源。

句柄階層中的 Web 套接字

Web 套接字句柄繼承自連線和會話句柄,並在句柄階層中佔據類似位置,就像要求句柄一樣。 若要建立 Web 套接字句柄,要求句柄必須存在;但建立 Web 套接字句柄之後,要求可能會關閉,而且 Web 套接字句柄會繼續運作。