Bagikan melalui


Metode IHttpResponse::SetHeader

Mengatur atau menambahkan nilai header respons HTTP tertentu.

Sintaks

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;  

Parameter

pszHeaderName
[IN] Penunjuk ke string yang berisi nama header HTTP yang akan diatur.

ulHeaderIndex
[IN] ID header HTTP yang akan diatur.

pszHeaderValue
[IN] Penunjuk ke string yang berisi nilai header yang akan diatur.

cchHeaderValue
[IN] Panjang, dalam karakter, dari nilai header, tidak termasuk karakter \0.

fReplace
[IN] Menentukan apakah header yang ada harus ditimpa.

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_INVALID_DATA Menunjukkan bahwa data tidak valid (misalnya, data di header terlalu panjang).
ERROR_INVALID_PARAMETER Menunjukkan bahwa parameter yang ditentukan tidak valid (misalnya, parameter diatur ke NULL).
ERROR_NOT_ENOUGH_MEMORY Menunjukkan bahwa tidak ada cukup memori untuk melakukan operasi.

Keterangan

Metode SetHeader ini menetapkan nilai header HTTP untuk respons saat ini. Ada dua versi metode yang SetHeader kelebihan beban. Yang pertama memungkinkan Anda menentukan header dengan menggunakan string yang terkandung dalam pszHeaderName parameter . Kelebihan beban lainnya menggunakan bilangan bulat panjang yang tidak ditandatangani yang terkandung dalam ulHeaderIndex parameter .

Catatan

Anda tidak boleh menggunakan kelebihan beban yang menggunakan ulHeaderIndex parameter untuk mengatur nilai Server header, karena nilai Anda akan ditambahkan ke nilai header yang ada. Gunakan parameter sebagai gantinya pszHeaderName .

Nama header yang ditentukan oleh pszHeaderName parameter dapat berupa header kustom atau header yang ditentukan dalam Request for Comments (RFC) 1945, "Hypertext Transfer Protocol -- HTTP/1.0," atau RFC 2616, "Hypertext Transfer Protocol -- HTTP/1.1."

Catatan

Parameter pszHeaderName tidak boleh NULL.

Parameter ulHeaderIndex menentukan ID header HTTP yang tercantum dalam HTTP_HEADER_ID enumerasi.

Catatan

HTTP_HEADER_ID Enumerasi didefinisikan dalam file header Http.h.

fReplace Jika parameter adalah true, nilai header yang ditentukan akan menggantikan nilai header yang ada jika header ada. Jika fReplace adalah false, nilai header yang ditentukan harus ditambahkan ke header yang ada dan dipisahkan dari header itu sendiri dengan koma.

Catatan

Modul atau penangan lain dapat memanggil SetHeader metode untuk menggantikan nilai atau menambahkan nilai Anda ke nilai yang telah Anda tentukan.

Contoh

Contoh kode berikut menunjukkan cara menggunakan kedua kelebihan beban SetHeader metode untuk mengganti HTTP Content-Type dan Server header dengan nilai kustom dan mengatur header HTTP Refresh ke jumlah detik tertentu.

#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
    );
}

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 IHttpResponse
Metode IHttpResponse::D eleteHeader
Metode IHttpResponse::GetHeader