IHttpServer::GetManagedType-Methode
Ruft den verwalteten Typ für einen bestimmten Standort und den URI (Uniform Resource Identifier) ab.
Syntax
virtual HRESULT GetManagedType(
IN DWORD dwSiteId,
IN PCWSTR pszVirtualPath,
__out PWSTR pszManagedType,
IN OUT DWORD* pcchManagedType
) = 0;
Parameter
dwSiteId
[IN] Der Standortbezeichner für den URI in pszVirtualPath
.
pszVirtualPath
[IN] Ein Zeiger auf eine Zeichenfolge, die einen URI enthält.
pszManagedType
[__out] Ein Zeiger auf einen vorab zugewiesenen Zeichenfolgenpuffer.
pcchManagedType
[IN] [OUT] Die Länge des Puffers pszManagedType
in Bytes.
Rückgabewert
HRESULT
. Mögliches Werte (aber nicht die Einzigen) sind die in der folgenden Tabelle.
Wert | BESCHREIBUNG |
---|---|
S_OK | Gibt an, dass der Vorgang erfolgreich war. |
E_INVALIDARG | Gibt an, dass ein ungültiger Wert in einem der Parameter übergeben wurde (z. B. ist einer der Zeiger auf NULL festgelegt). |
E_OUTOFMEMORY | Gibt an, dass nicht genügend Arbeitsspeicher zum Ausführen des Vorgangs verfügbar ist. |
ERROR_INVALID_PARAMETER | Gibt an, dass in einem der Parameter ein ungültiger Wert übergeben wurde. |
ERROR_INSUFFICIENT_BUFFER | Gibt an, dass nicht genügend Pufferspeicherplatz zum Ausführen des Vorgangs vorhanden ist. |
Bemerkungen
Die GetManagedType
-Methode ruft das Attribut für den type
Anforderungshandler ab, der einen bestimmten virtuellen Pfad verarbeitet, der durch die dwSiteId
Parameter und pszVirtualPath
angegeben wird. Die -Methode gibt dann diese Informationen im Puffer zurück, der durch den pszManagedType
-Parameter angegeben wird.
Wichtig
Der Aufrufer muss den Puffer für pszManagedType
zuordnen. Wenn der Aufrufer NULL für diesen Parameter übergibt, gibt die Methode E_INVALIDARG zurück.
Das type
Attribut für einen Anforderungshandler befindet sich im <handlers>
Abschnitt der ApplicationHost.config-Datei. Dieses Attribut enthält eine Liste der .NET Framework Namespaces für einen Anforderungshandler. Beispielsweise weist der Anforderungshandler "TraceHandler-Integrated" standardmäßig das type
Attribut "System.Web.Handlers.TraceHandler" auf.
Die IHttpServer::GetManagedType
Methode unterscheidet sich von der IScriptMapInfo::GetManagedType-Methode darin, dass die IHttpServer::GetManagedType
Methode das type
Attribut für jeden virtuellen Pfad abrufen kann, während die IScriptMapInfo::GetManagedType
Methode nur das type
Attribut für die IScriptMapInfo-Schnittstelle abruft.
Beispiel
Im folgenden Codebeispiel wird veranschaulicht, wie mithilfe der GetManagedType
-Methode ein HTTP-Modul erstellt wird, das den verwalteten Typ für den /default.aspx-URI abruft.
Das Modul führt die folgenden Schritte aus:
Ruft den Standortbezeichner für die aktuelle Anforderung ab.
Ruft die Länge ab, die zum Abrufen des verwalteten Typs für die Anforderung erforderlich ist.
Weist einen Puffer für den verwalteten Typ zu.
Ruft den verwalteten Typ ab.
Gibt das Ergebnis an einen Webclient zurück 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 );
// Create an HRESULT to receive return values from methods.
HRESULT hr;
// Retrieve the site ID.
DWORD dwSiteId = pHttpContext->GetSite()->GetSiteId();
// Create buffers to store the managed type.
PWSTR pwszManagedType =
(PWSTR) pHttpContext->AllocateRequestMemory( 1 );
char* pszManagedType = NULL;
DWORD cchManagedType = 0;
// Test for an error.
if (NULL != pwszManagedType)
{
// Retrieve the size of the managed type.
hr = g_pHttpServer->GetManagedType(
dwSiteId,L"/default.aspx",
pwszManagedType,&cchManagedType);
// Test for an error.
if ((HRESULT_CODE(hr)==ERROR_INSUFFICIENT_BUFFER) && (cchManagedType>0))
{
// Allocate space for the managed type.
pwszManagedType =
(PWSTR) pHttpContext->AllocateRequestMemory(
(cchManagedType*2)+1 );
// Test for an error.
if (NULL == pwszManagedType)
{
// Set the error status.
hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
pProvider->SetErrorStatus( hr );
}
else
{
// Retrieve the managed type.
hr = g_pHttpServer->GetManagedType(
dwSiteId,L"/default.aspx",
pwszManagedType,&cchManagedType);
// Test for an error.
if (SUCCEEDED(hr))
{
// 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);
// Allocate space for the managed type.
pszManagedType =
(char*) pHttpContext->AllocateRequestMemory(
(DWORD) wcslen(pwszManagedType)+1 );
// Test for an error.
if (NULL == pszManagedType)
{
// Set the error status.
hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
pProvider->SetErrorStatus( hr );
}
else
{
// Convert the WCHAR string to a CHAR string.
wcstombs(pszManagedType,
pwszManagedType,wcslen(pwszManagedType));
// Return the managed type to the client.
WriteResponseMessage(pHttpContext,"Managed type: ",
(cchManagedType>1) ? pszManagedType : "n/a");
}
// End additional processing.
return RQ_NOTIFICATION_FINISH_REQUEST;
}
}
}
}
// Return processing to the pipeline.
return RQ_NOTIFICATION_FINISH_REQUEST;
}
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.
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
);
}
Ihr Modul muss die RegisterModule-Funktion exportieren. Sie können diese Funktion exportieren, indem Sie eine Moduldefinitionsdatei (.def) für Ihr Projekt erstellen, oder Sie können das Modul mithilfe des Schalters /EXPORT:RegisterModule
kompilieren. Weitere Informationen 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)
Aufrufkonvention verwenden, anstatt die Aufrufkonvention 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 unter 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 unter 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
IScriptMapInfo::GetManagedType-Methode