Freigeben über


IHttpServer::GetFileInfo-Methode

Gibt eine IHttpFileInfo-Schnittstelle für einen bestimmten Dateipfad zurück.

Syntax

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;  

Parameter

pszPhysicalPath
[IN] Ein Zeiger auf eine Zeichenfolge, die den physischen Pfad zu einer Datei enthält.

hUserToken
[IN] Ein HANDLE , das das Token für den Identitätswechselbenutzer enthält, andernfalls NULL.

pSid
[IN] Ein Zeiger auf einen Sicherheitsbezeichner (Security Identifier, SID), der die Sicherheits-ID für den Identitätswechselbenutzer enthält; andernfalls NULL.

pszVrPath
[IN] Ein Zeiger auf eine Zeichenfolge, die den virtuellen Pfad für die Registrierung für Änderungsbenachrichtigungen enthält; andernfalls NULL.

hVrToken
[IN] Ein HANDLE , das das Identitätswechseltoken enthält, das für Änderungsbenachrichtigungen registriert werden soll, andernfalls NULL.

fCache
[IN] true , um anzugeben, dass die Datei zwischengespeichert werden soll; falseandernfalls .

ppFileInfo
[OUT] Ein Rückschlusszeiger auf eine IHttpFileInfo Schnittstelle.

pHttpTraceContext
[IN] Ein Zeiger auf eine optionale IHttpTraceContext-Schnittstelle .

Rückgabewert

HRESULT. Mögliches Werte (aber nicht die Einzigen) sind die in der folgenden Tabelle.

Wert Definition
S_OK Gibt an, dass der Vorgang erfolgreich war.
E_FAIL Gibt an, dass der Aufruf von GetFileInfo erfolgt ist, während der Modulhost beendet wurde.

Bemerkungen

Die IHttpServer::GetFileInfo -Methode erstellt eine IHttpFileInfo Schnittstelle für einen bestimmten Pfad. Diese Methode unterscheidet sich von der IHttpContext::GetFileInfo-Methode , die eine IHttpFileInfo Schnittstelle für die Datei zurückgibt, die IIS in einem Anforderungskontext verarbeitet.

Die pszPhysicalPath Parameter und ppFileInfo sind erforderlich, um eine IHttpFileInfo Schnittstelle zu erstellen. Der pszPhysicalPath Parameter gibt den Pfad zur Datei an, und der ppFileInfo Parameter definiert den Zeiger, den IIS mit der entsprechenden IHttpFileInfo Schnittstelle auffüllt.

Die pszVrPath Parameter und hVrToken sind optional, und Sie sollten sie auf NULL festlegen, wenn Sie sie nicht verwenden. Diese Parameter geben jeweils den virtuellen Pfad und das Identitätswechseltoken an, die verwendet werden sollen, wenn sich ein Modul für Änderungsbenachrichtigungen registriert (z. B. wenn Sie die Zwischenspeicherung anfordern, indem Sie den fCache Parameter auf truefestlegen).

Hinweis

Andere Konfigurationseinstellungen verhindern möglicherweise, dass IIS die Datei zwischenspeichert, auch wenn Sie für den fCache Parameter angebentrue.

Die hUserToken Parameter und pSid sind ebenfalls optional, und Sie sollten sie auf NULL festlegen, wenn Sie sie nicht verwenden. Diese Parameter geben jeweils das Token und die SID für den Identitätswechselbenutzer an. Der verbleibende optionale Parameter , pHttpTraceContextgibt die Schnittstelle für die IHttpTraceContext Ablaufverfolgung an.

Beispiel

Im folgenden Codebeispiel wird veranschaulicht, wie Sie ein HTTP-Modul erstellen, das die folgenden Aufgaben ausführt:

  1. Registriert sich für die RQ_BEGIN_REQUEST-Benachrichtigung .

  2. Erstellt eine CHttpModule-Klasse , die eine OnBeginRequest-Methode enthält. Wenn ein Client eine Datei anfordert, führt die OnBeginRequest Methode die folgenden Aufgaben aus:

    1. Ordnet einen Pfad einer relativen URL mithilfe der IHttpContext::MapPath-Methode zu.

    2. Erstellt mithilfe der -Methode eine IHttpFileInfo Schnittstelle für den IHttpServer::GetFileInfo Dateipfad.

    3. Ruft das Entitätstag für die Datei mithilfe der IHttpFileInfo::GetETag-Methode ab.

    4. Gibt das Entitätstag mithilfe der IHttpResponse::WriteEntityChunks-Methode an den Client zurück.

  3. Entfernt die CHttpModule -Klasse aus dem Arbeitsspeicher und wird dann beendet.

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

Weitere Informationen zum Erstellen und Bereitstellen eines nativen DLL-Moduls finden Sie unter Exemplarische Vorgehensweise: Erstellen eines Request-Level HTTP-Moduls mithilfe von nativem Code.

Sie können den Code optional kompilieren, indem Sie die __stdcall (/Gz) aufrufende Konvention verwenden, anstatt die aufrufende Konvention für jede Funktion explizit zu deklarieren.

Anforderungen

type BESCHREIBUNG
Client – IIS 7.0 unter Windows Vista
– IIS 7.5 unter Windows 7
– IIS 8.0 unter Windows 8
– IIS 10.0 auf Windows 10
Server – IIS 7.0 unter Windows Server 2008
– IIS 7.5 unter Windows Server 2008 R2
– IIS 8.0 unter Windows Server 2012
– IIS 8.5 unter Windows Server 2012 R2
– IIS 10.0 auf Windows Server 2016
Produkt – 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

Weitere Informationen

IHttpServer-Schnittstelle
IHttpContext::GetFileInfo-Methode