共用方式為


IHttpResponse::SetHeader 方法

設定或附加指定 HTTP 回應標頭的值。

語法

virtual HRESULT SetHeader(  
   IN PCSTR pszHeaderName,  
   IN PCSTR pszHeaderValue,  
   IN USHORT cchHeaderValue,  
   IN BOOL fReplace  
) = 0;  
  
virtual HRESULT SetHeader(  
   IN HTTP_HEADER_ID ulHeaderIndex,  
   IN PCSTR pszHeaderValue,  
   IN USHORT cchHeaderValue,  
   IN BOOL fReplace  
) = 0;  

參數

pszHeaderName
[IN]字串的指標,其中包含要設定的 HTTP 標頭名稱。

ulHeaderIndex
[IN]要設定的 HTTP 標頭識別碼。

pszHeaderValue
[IN]字串的指標,其中包含要設定之標頭的值。

cchHeaderValue
[IN]標頭值的長度,以字元為單位,不包括 \0 字元。

fReplace
[IN]指定是否應該覆寫現有的標頭。

傳回值

HRESULT。 可能的值包括 (但不限於) 下表中的這些值。

描述
S_OK 表示作業成功。
ERROR_INVALID_DATA 表示資料無效 (例如,標頭中的資料太長) 。
ERROR_INVALID_PARAMETER 表示指定的參數無效 (例如,參數會設定為 Null) 。
ERROR_NOT_ENOUGH_MEMORY 表示記憶體不足,無法執行作業。

備註

方法 SetHeader 會設定目前回應的 HTTP 標頭值。 方法有兩個 SetHeader 多載版本。 第一個可讓您使用 參數中包含的 pszHeaderName 字串來指定標頭。 另一個多載會使用 參數中包含的 ulHeaderIndex 不帶正負號長整數。

注意

您不應該使用使用 ulHeaderIndex 參數的多載來設定標頭的值 Server ,因為您的值將會附加至現有的標頭值。 請改用 pszHeaderName 參數。

參數指定的 pszHeaderName 標頭名稱可以是自訂標頭或標頭,定義于要求批註 (RFC) 1945:「超文字傳輸通訊協定 -- HTTP/1.0」或 RFC 2616「超文字傳輸通訊協定 -- HTTP/1.1」。

注意

參數 pszHeaderName 不可為 Null。

參數 ulHeaderIndex 會指定列舉中列出的 HTTP 標頭識別碼 HTTP_HEADER_ID

注意

列舉 HTTP_HEADER_ID 定義于 Http.h 標頭檔中。

fReplace如果 參數為 true ,則指定的標頭值將會在標頭存在時取代現有的標頭值。 如果 為 fReplacefalse ,則指定的標頭值應該附加至現有的標頭,並以逗號分隔標頭本身。

注意

其他模組或處理常式可能會呼叫 SetHeader 方法來取代您的值,或將值附加至您指定的值。

範例

下列程式碼範例示範如何使用 方法的 SetHeader 這兩個多載,將 HTTP Content-TypeServer 標頭取代為自訂值,並將 HTTP Refresh 標頭設定為特定秒數。

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

// Create the module class.
class MyHttpModule : public CHttpModule
{
public:
    REQUEST_NOTIFICATION_STATUS
    OnSendResponse(
        IN IHttpContext * pHttpContext,
        IN ISendResponseProvider * pProvider
    )
    {
        UNREFERENCED_PARAMETER( pProvider );

        // Create an HRESULT to receive return values from methods.
        HRESULT hr;
        
        // Set the "Refresh" header name.
        char szRefreshName[] = "Refresh";
        // Set the "Refresh" header value.
        char szRefreshValue[] = "30";
        // Set the "Content-Type" header value.
        char szContentType[] = "text/plain";
        // Set the "Server" header value.
        char szServerValue[] = "MyServer/7.0";

        // Retrieve a pointer to the response.
        IHttpResponse * pHttpResponse = pHttpContext->GetResponse();

        // Test for an error.
        if (pHttpResponse != NULL)
        {

            // Set the "Refresh" header.
            hr = pHttpResponse->SetHeader(
                szRefreshName,szRefreshValue,
                (USHORT)strlen(szRefreshValue),FALSE);

            // Test for an error.
            if (FAILED(hr))
            {
                // Set the error status.
                pProvider->SetErrorStatus( hr );
                // End additional processing.
                return RQ_NOTIFICATION_FINISH_REQUEST;
            }

            // Set the "Content-Type" header.
            hr = pHttpResponse->SetHeader(
                HttpHeaderContentType,szContentType,
                (USHORT)strlen(szContentType),TRUE);

            // Test for an error.
            if (FAILED(hr))
            {
                // Set the error status.
                pProvider->SetErrorStatus( hr );
                // End additional processing.
                return RQ_NOTIFICATION_FINISH_REQUEST;
            }

            // Set the "Server" header.
            hr = pHttpResponse->SetHeader(
                "Server",szServerValue,
                (USHORT)strlen(szServerValue),TRUE);

            // Test for an error.
            if (FAILED(hr))
            {
                // Set the error status.
                pProvider->SetErrorStatus( 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 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 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 MyHttpModuleFactory,
        RQ_SEND_RESPONSE,
        0
    );
}

您的模組必須匯出 RegisterModule 函式 。 您可以為專案建立模組定義 (.def) 檔案,或使用 參數編譯模組 /EXPORT:RegisterModule 來匯出此函式。 如需詳細資訊,請參閱逐步解說 :使用機器碼建立Request-Level HTTP 模組

您可以選擇性地使用呼叫慣例編譯器代碼, __stdcall (/Gz) 而不是明確宣告每個函式的呼叫慣例。

規格需求

類型 描述
Client - Windows Vista 上的 IIS 7.0
- Windows 7 上的 IIS 7.5
- Windows 8 上的 IIS 8.0
- Windows 10上的 IIS 10.0
伺服器 - Windows Server 2008 上的 IIS 7.0
- Windows Server 2008 R2 上的 IIS 7.5
- Windows Server 2012 上的 IIS 8.0
- Windows Server 2012 R2 上的 IIS 8.5
- Windows Server 2016上的 IIS 10.0
產品 - 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
標頭 Httpserv.h

另請參閱

IHttpResponse 介面
IHttpResponse::D eleteHeader 方法
IHttpResponse::GetHeader 方法