Condividi tramite


Metodo IHttpServer::GetFileInfo

Restituisce un'interfaccia IHttpFileInfo per un percorso di file specifico.

Sintassi

virtual HRESULT GetFileInfo(  
   IN PCWSTR pszPhysicalPath,  
   IN HANDLE hUserToken,  
   IN PSID pSid,  
   IN PCWSTR pszVrPath,  
   IN HANDLE hVrToken,  
   IN BOOL fCache,  
   OUT IHttpFileInfo** ppFileInfo,  
   IN IHttpTraceContext* pHttpTraceContext = NULL  
) = 0;  

Parametri

pszPhysicalPath
[IN] Puntatore a una stringa contenente il percorso fisico di un file.

hUserToken
[IN] Oggetto HANDLE contenente il token per l'utente di rappresentazione; in caso contrario, NULL.

pSid
[IN] Puntatore a un ID di sicurezza (SID) che contiene l'ID di sicurezza per l'utente di rappresentazione; in caso contrario, NULL.

pszVrPath
[IN] Puntatore a una stringa contenente il percorso virtuale da registrare per le notifiche di modifica; in caso contrario, NULL.

hVrToken
[IN] Oggetto HANDLE contenente il token di rappresentazione da registrare per le notifiche di modifica; in caso contrario, NULL.

fCache
[IN] true per indicare che il file deve essere memorizzato nella cache; in caso contrario, false.

ppFileInfo
[OUT] Puntatore dereferenziato a un'interfaccia IHttpFileInfo .

pHttpTraceContext
[IN] Puntatore a un'interfaccia IHttpTraceContext facoltativa.

Valore restituito

Oggetto HRESULT. I valori possibili includono, ma non sono limitati a, quelli indicati nella tabella seguente.

valore Definizione
S_OK Indica che l'operazione è riuscita.
E_FAIL Indica che la chiamata a GetFileInfo è stata effettuata mentre l'host del modulo è stato terminato.

Commenti

Il IHttpServer::GetFileInfo metodo crea un'interfaccia IHttpFileInfo per un percorso specifico. Questo metodo è diverso dal metodo IHttpContext::GetFileInfo , che restituisce un'interfaccia IHttpFileInfo per il file che IIS sta elaborando all'interno di un contesto di richiesta.

I pszPhysicalPath parametri e ppFileInfo sono necessari per creare un'interfaccia IHttpFileInfo . Il pszPhysicalPath parametro specifica il percorso del file e il ppFileInfo parametro definisce il puntatore che IIS popola con l'interfaccia corrispondente IHttpFileInfo .

I pszVrPath parametri e hVrToken sono facoltativi ed è necessario impostarli su NULL se non vengono usati. Questi parametri specificano rispettivamente il percorso virtuale e il token di rappresentazione da usare quando un modulo esegue la registrazione per le notifiche di modifica, ad esempio se si richiede la memorizzazione nella cache impostando il fCache parametro su true.

Nota

Altre impostazioni di configurazione possono impedire a IIS di memorizzare nella cache il file, anche se si specifica true per il fCache parametro .

Anche i hUserToken parametri e pSid sono facoltativi ed è necessario impostarli su NULL se non vengono usati. Questi parametri specificano rispettivamente il token e il SID per l'utente di rappresentazione. Il parametro facoltativo rimanente, pHttpTraceContext, specifica l'interfaccia per la IHttpTraceContext traccia.

Esempio

L'esempio di codice seguente illustra come creare un modulo HTTP che esegue le attività seguenti:

  1. Esegue la registrazione per la notifica di RQ_BEGIN_REQUEST .

  2. Crea una classe CHttpModule che contiene un metodo OnBeginRequest . Quando un client richiede un file, il OnBeginRequest metodo esegue le attività seguenti:

    1. Esegue il mapping di un percorso a un URL relativo usando il metodo IHttpContext::MapPath .

    2. Crea un'interfaccia IHttpFileInfo per il percorso del file usando il IHttpServer::GetFileInfo metodo .

    3. Recupera il tag di entità per il file usando il metodo IHttpFileInfo::GetETag .

    4. Restituisce il tag di entità al client usando il metodo IHttpResponse::WriteEntityChunks .

  3. Rimuove la CHttpModule classe dalla memoria e quindi viene chiusa.

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

// Create a pointer for the global server interface.
IHttpServer * g_pHttpServer = NULL;

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

        HRESULT hr;

        PWSTR wszUrl = L"/example/default.asp";
        WCHAR wszPhysicalPath[1024] = L"";
        DWORD cbPhysicalPath = 1024;

        pHttpContext->MapPath(wszUrl,wszPhysicalPath,&cbPhysicalPath);

        if (NULL != wszPhysicalPath)
        {
            IHttpFileInfo * pHttpFileInfo;
            hr = g_pHttpServer->GetFileInfo(wszPhysicalPath,
                NULL,NULL,wszUrl,NULL,TRUE,&pHttpFileInfo);
            if (NULL != pHttpFileInfo)
            {
                // Create a buffer for the Etag.
                USHORT cchETag;
                // Retrieve the Etag.
                PCSTR pszETag = pHttpFileInfo->GetETag(&cchETag);
                //Test for an error.
                if (NULL != pszETag)
                {
                    // Clear the existing response.
                    pHttpContext->GetResponse()->Clear();
                    // Set the MIME type to plain text.
                    pHttpContext->GetResponse()->SetHeader(
                        HttpHeaderContentType,"text/plain",
                        (USHORT)strlen("text/plain"),TRUE);
                    // Return the Etag to the client.
                    WriteResponseMessage(pHttpContext,
                        "ETag: ",pszETag);
                    // End additional processing.
                    return RQ_NOTIFICATION_FINISH_REQUEST;
                }
            }
        }

        // Return processing to the pipeline.
        return RQ_NOTIFICATION_CONTINUE;
    }
private:

    // Create a utility method that inserts a name/value pair into the response.
    HRESULT WriteResponseMessage(
        IHttpContext * pHttpContext,
        PCSTR pszName,
        PCSTR pszValue
    )
    {
        // Create an HRESULT to receive return values from methods.
        HRESULT hr;
        
        // Create a data chunk. (Defined in the Http.h file.)
        HTTP_DATA_CHUNK dataChunk;
        // Set the chunk to a chunk in memory.
        dataChunk.DataChunkType = HttpDataChunkFromMemory;
        // Buffer for bytes written of data chunk.
        DWORD cbSent;

        // Set the chunk to the first buffer.
        dataChunk.FromMemory.pBuffer =
            (PVOID) pszName;
        // Set the chunk size to the first buffer size.
        dataChunk.FromMemory.BufferLength =
            (USHORT) strlen(pszName);
        // Insert the data chunk into the response.
        hr = pHttpContext->GetResponse()->WriteEntityChunks(
            &dataChunk,1,FALSE,TRUE,&cbSent);
        // Test for an error.
        if (FAILED(hr))
        {
            // Return the error status.
            return hr;
        }

        // Set the chunk to the second buffer.
        dataChunk.FromMemory.pBuffer =
            (PVOID) pszValue;
        // Set the chunk size to the second buffer size.
        dataChunk.FromMemory.BufferLength =
            (USHORT) strlen(pszValue);
        // Insert the data chunk into the response.
        hr = pHttpContext->GetResponse()->WriteEntityChunks(
            &dataChunk,1,FALSE,TRUE,&cbSent);
        // Test for an error.
        if (FAILED(hr))
        {
            // Return the error status.
            return hr;
        }

        // Return a success status.
        return S_OK;
    }
};

// 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 );

    // Store the pointer for the global server interface.
    g_pHttpServer = pGlobalInfo;

    // Set the request notifications and exit.
    return pModuleInfo->SetRequestNotifications(
        new MyHttpModuleFactory,
        RQ_BEGIN_REQUEST,
        0
    );
}

Per altre informazioni su come creare e distribuire un modulo DLL nativo, vedere Procedura dettagliata: Creazione di un modulo HTTP Request-Level tramite codice nativo.

Facoltativamente, è possibile compilare il codice usando la __stdcall (/Gz) convenzione di chiamata anziché dichiarare in modo esplicito la convenzione di chiamata per ogni funzione.

Requisiti

Tipo Descrizione
Client - IIS 7.0 in Windows Vista
- IIS 7.5 in Windows 7
- IIS 8.0 in Windows 8
- IIS 10.0 in Windows 10
Server - IIS 7.0 in Windows Server 2008
- IIS 7.5 in Windows Server 2008 R2
- IIS 8.0 in Windows Server 2012
- IIS 8.5 in Windows Server 2012 R2
- IIS 10.0 in Windows Server 2016
Prodotto - 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
Intestazione Httpserv.h

Vedere anche

Interfaccia IHttpServer
Metodo IHttpContext::GetFileInfo