HTTP Server 2.0 版 API 命名要求佇列功能可讓多個應用程式在個別進程和使用者帳戶下運作,存取要求佇列。 要求佇列會依名稱開啟,並使用訪問控制清單 (ACL) 來保護,以確保應用程式無法存取彼此的數據。 單一進程會建立要求佇列,並將許可權授與其他進程以使用要求佇列。 因此,計算機上的其他進程會以服務要求所需的最低許可權存取要求佇列。 由於第三方程序代碼中的弱點,HTTP 服務可能會損毀,當應用程式以最低許可權執行時,就會最小化。
具名要求佇列會使用 HttpCreateRequestQueue 函式來建立。 建立要求佇列時,應用程式會在 pSecurityAttribute 參數中指定 ACL。 ACL 只能在建立要求佇列時設定,可讓背景工作進程開啟要求佇列、接收要求及傳送回應。 根據預設,除非進程已在 ACL 中授與許可權,否則不允許開啟要求佇列。 應用程式不需要系統管理許可權來建立要求佇列。
要求佇列必須以 pName 參數中指定的名稱建立,HttpCreateRequestQueue,其他進程才能開啟要求佇列。 如果 pNameNULL,則會建立未命名的要求佇列,而且無法開啟其他進程。
建立者和控制器程式
建立要求佇列時,應用程式可以開啟它做為控制器進程或建立者進程。 控制器和建立者進程都會當做要求佇列的系統管理員,但控制器不會對它執行 I/O 作業。 應用程式會指定 HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLERHttpCreateRequestQueue的 Flags 參數來建立要求佇列時,它是控制器進程。 如果未設定 HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER 旗標,則應用程式是建立者程式。
下列清單包含控制器進程和建立者程式所執行的工作:
- 建立要求佇列並指定名稱。
- 使用 HttpSetRequestQueueProperty 函式來設定要求佇列。
- 使用 HttpQueryRequestQueueProperty 函式來查詢要求佇列組態參數。
- 建立 URL 群組,並將其與要求佇列產生關聯。
- 設定 ACL,指定允許在要求佇列上接收 I/O 的背景工作進程。
- 呼叫 HttpWaitForDemandStart 延遲背景工作進程的具現化,直到第一個要求抵達要求佇列為止。
除了這些工作之外,建立者程式也可以在要求佇列上執行 I/O 作業。
背景工作進程
背景工作進程只能在 ACL 中授與現有要求佇列的存取權時,才能開啟現有的要求佇列。 以最低許可權運作的背景工作進程可以開啟要求佇列,並在其上執行 I/O。 應用程式會呼叫 HttpCreateRequestQueue,並使用 Flags 參數中的 HTTP_CREATE_REQUEST_QUEUE_FLAG_OPEN_EXISTING,以及 pName 參數 中的要求佇列名稱,來開啟現有的要求佇列。
背景工作行程會執行下列功能:
- 接收要求,並在要求佇列上傳送回應。
- 依名稱開啟現有的要求佇列。 傳回給背景工作進程之要求佇列的句柄無法用來設定要求佇列。
- 查詢要求佇列組態參數。
下圖顯示要求佇列的背景工作進程模型。 要求佇列可以有數個處理 I/O 的背景工作進程,以及一個設定要求佇列的建立者進程。