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:
Esegue la registrazione per la notifica di RQ_BEGIN_REQUEST .
Crea una classe CHttpModule che contiene un metodo OnBeginRequest . Quando un client richiede un file, il
OnBeginRequest
metodo esegue le attività seguenti:Esegue il mapping di un percorso a un URL relativo usando il metodo IHttpContext::MapPath .
Crea un'interfaccia
IHttpFileInfo
per il percorso del file usando ilIHttpServer::GetFileInfo
metodo .Recupera il tag di entità per il file usando il metodo IHttpFileInfo::GetETag .
Restituisce il tag di entità al client usando il metodo IHttpResponse::WriteEntityChunks .
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 |