IHttpRequest::SetUrl (Método)
Modifica la dirección URL de la solicitud.
Sintaxis
virtual HRESULT SetUrl(
IN PCWSTR pszUrl,
IN DWORD cchUrl,
IN BOOL fResetQueryString
) = 0;
virtual HRESULT SetUrl(
IN PCSTR pszUrl,
IN DWORD cchUrl,
IN BOOL fResetQueryString
) = 0;
Parámetros
pszUrl
[IN] Puntero a una cadena que contiene la dirección URL que se va a establecer.
cchUrl
[IN] Longitud, en caracteres, de la dirección URL especificada por pszUrl
.
fResetQueryString
[IN] true
para restablecer la cadena de consulta existente; de lo contrario, false
.
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. |
ERROR_INVALID_PARAMETER | Indica que el parámetro especificado no es válido (por ejemplo, la dirección URL especificada es demasiado larga). |
ERROR_NOT_ENOUGH_MEMORY | Indica que no hay memoria suficiente para realizar la operación. |
Observaciones
El SetUrl
método modifica la dirección URL de la solicitud actual. Hay dos versiones sobrecargadas del SetUrl
método . Uno le permite especificar el encabezado mediante un puntero a una cadena. La otra sobrecarga usa un puntero a una cadena ancha.
Las siguientes funciones de procesamiento de solicitudes y operaciones de registro procesarán la nueva dirección URL como si el cliente hubiera solicitado la dirección URL. Por lo tanto, las condiciones de error causadas por la modificación de la dirección URL se devolverán al cliente. Por ejemplo, si la nueva dirección URL no existe, el servidor web devolverá un error HTTP 404.
Advertencia
Se SetUrl
llama al método después de recopilar los parámetros iniciales de la solicitud, por lo que es posible que el procesamiento de solicitudes posterior no sea consciente de la dirección URL modificada. Por ejemplo, la recuperación de la variable de servidor url reflejará la solicitud original, no la dirección URL modificada. Los implementadores deben llamar al método IHttpContext::ExecuteRequest en lugar de para ejecutar la solicitud a través de SetUrl
la canalización completa. El SetUrl
método no debe usarse para la reescritura de direcciones URL.
Nota
A diferencia del método IHttpResponse::Redirect , el SetUrl
método no redirige a un cliente a una nueva dirección URL.
Nota
Debe llamar al SetUrl
método antes del primer evento de la canalización de procesamiento de solicitudes integrada HTTP. Llamar al SetUrl
método desde un controlador OnPostBeginRequest da como resultado un comportamiento indeterminado.
Ejemplo
En el ejemplo de código siguiente se muestra cómo usar el SetUrl
método para cambiar una dirección URL solicitada a otra dirección URL.
#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>
// Create the module class.
class MyHttpModule : public CHttpModule
{
public:
REQUEST_NOTIFICATION_STATUS
OnBeginRequest(
IN IHttpContext * pHttpContext,
IN IHttpEventProvider * pProvider
)
{
HRESULT hr;
// Retrieve a pointer to the request.
IHttpRequest * pHttpRequest = pHttpContext->GetRequest();
// Test for an error.
if (pHttpRequest != NULL)
{
// Create a buffer with an example URL.
PCSTR pszBuffer = "/example/default.aspx";
// Set the URL for the request.
hr = pHttpRequest->SetUrl(
pszBuffer,(DWORD)strlen(pszBuffer),true);
// Test for an error.
if (FAILED(hr))
{
// Set the error status.
pProvider->SetErrorStatus( hr );
// End additional processing.
return RQ_NOTIFICATION_FINISH_REQUEST;
}
}
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
};
// 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 );
UNREFERENCED_PARAMETER( pGlobalInfo );
// Set the request notifications and exit.
return pModuleInfo->SetRequestNotifications(
new MyHttpModuleFactory,
RQ_BEGIN_REQUEST,
0
);
}
Requisitos
Tipo | Descripción |
---|---|
Cliente | - IIS 7.0 en Windows Vista - IIS 7.5 en Windows 7 - IIS 8.0 en Windows 8 - IIS 10.0 en Windows 10 |
Server | - 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
IHttpRequest (interfaz)
IHttpRequest::GetUrlChanged (Método)