IHttpServer::GetManagedType (Método)
Recupera el tipo administrado para un sitio específico y un identificador uniforme de recursos (URI).
Sintaxis
virtual HRESULT GetManagedType(
IN DWORD dwSiteId,
IN PCWSTR pszVirtualPath,
__out PWSTR pszManagedType,
IN OUT DWORD* pcchManagedType
) = 0;
Parámetros
dwSiteId
[IN] Identificador de sitio para el URI en pszVirtualPath
.
pszVirtualPath
[IN] Puntero a una cadena que contiene un URI.
pszManagedType
[__out] Puntero a un búfer de cadena asignado previamente.
pcchManagedType
[IN] [OUT] Longitud, en bytes, del pszManagedType
búfer.
Valor devuelto
Una clase HRESULT
. Entre los valores posibles se incluyen los que se indican en la tabla siguiente, entre otros.
Valor | Descripción |
---|---|
S_OK | Indica que la operación se realizó correctamente. |
E_INVALIDARG | Indica que se pasó un valor no válido en uno de los parámetros (por ejemplo, uno de los punteros se establece en NULL). |
E_OUTOFMEMORY | Indica que no hay suficiente memoria disponible para realizar la operación. |
ERROR_INVALID_PARAMETER | Indica que se pasó un valor no válido en uno de los parámetros. |
ERROR_INSUFFICIENT_BUFFER | Indica que no hay suficiente espacio de búfer para realizar la operación. |
Comentarios
El GetManagedType
método recupera el atributo para el type
controlador de solicitudes que procesará una ruta de acceso virtual específica especificada por los dwSiteId
parámetros y pszVirtualPath
. A continuación, el método devuelve esta información en el búfer especificado por el pszManagedType
parámetro .
Importante
El llamador debe asignar el búfer para pszManagedType
. Si el autor de la llamada pasa NULL para este parámetro, el método devolverá E_INVALIDARG.
El type
atributo de un controlador de solicitudes se encuentra en la <handlers>
sección del archivo ApplicationHost.config. Este atributo contiene una lista de los espacios de nombres de .NET Framework para un controlador de solicitudes. Por ejemplo, el controlador de solicitudes "TraceHandler-Integrated" tiene un type
atributo de "System.Web.Handlers.TraceHandler" de forma predeterminada.
El IHttpServer::GetManagedType
método difiere del método IScriptMapInfo::GetManagedType en que el IHttpServer::GetManagedType
método puede recuperar el type
atributo de cualquier ruta de acceso virtual, mientras que el IScriptMapInfo::GetManagedType
método recuperará solo el type
atributo de la interfaz IScriptMapInfo .
Ejemplo
En el ejemplo de código siguiente se muestra cómo usar el GetManagedType
método para crear un módulo HTTP que recupere el tipo administrado para el URI /default.aspx.
El módulo completa los pasos siguientes:
Recupera el identificador del sitio para la solicitud actual.
Recupera la longitud necesaria para recuperar el tipo administrado de la solicitud.
Asigna un búfer para el tipo administrado.
Recupera el tipo administrado.
Devuelve el resultado a un cliente web y, a continuación, se cierra.
#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
);
}
El módulo debe exportar la función RegisterModule . Puede exportar esta función mediante la creación de un archivo de definición de módulo (.def) para el proyecto, o bien puede compilar el módulo mediante el /EXPORT:RegisterModule
modificador . Para obtener más información, vea Tutorial: Creación de un módulo HTTP de Request-Level mediante código nativo.
Opcionalmente, puede compilar el código mediante la __stdcall (/Gz)
convención de llamada en lugar de declarar explícitamente la convención de llamada para cada función.
Requisitos
Tipo | Descripción |
---|---|
Remoto | - IIS 7.0 en Windows Vista - IIS 7.5 en Windows 7 - IIS 8.0 en Windows 8 - IIS 10.0 en Windows 10 |
Servidor | - IIS 7.0 en Windows Server 2008 - IIS 7.5 en Windows Server 2008 R2 - IIS 8.0 en Windows Server 2012 - IIS 8.5 en Windows Server 2012 R2 - IIS 10.0 en Windows Server 2016 |
Producto | - 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 |
Encabezado | Httpserv.h |
Consulte también
IHttpServer (interfaz)
IScriptMapInfo::GetManagedType (Método)