Compartir a través de


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)