Partager via


IHttpRequest::SetUrl, méthode

Modifie l’URL de la requête.

Syntaxe

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;  

Paramètres

pszUrl
[IN] Pointeur vers une chaîne qui contient l’URL à définir.

cchUrl
[IN] Longueur, en caractères, de l’URL spécifiée par pszUrl.

fResetQueryString
[IN] true pour réinitialiser la chaîne de requête existante ; sinon, false.

Valeur renvoyée

Élément HRESULT. Les valeurs possibles sont notamment celles figurant dans le tableau suivant.

Value Description
S_OK Indique que l’opération a réussi.
ERROR_INVALID_PARAMETER Indique que le paramètre spécifié n’est pas valide (par exemple, l’URL spécifiée est trop longue).
ERROR_NOT_ENOUGH_MEMORY Indique que la mémoire est insuffisante pour effectuer l’opération.

Notes

La SetUrl méthode modifie l’URL de la requête actuelle. Il existe deux versions surchargées de la SetUrl méthode. L’une d’elles vous permet de spécifier l’en-tête à l’aide d’un pointeur vers une chaîne. L’autre surcharge utilise un pointeur vers une chaîne large.

Les fonctions de traitement des requêtes et les opérations de journalisation suivantes traitent la nouvelle URL comme si le client avait demandé l’URL. Par conséquent, toutes les conditions d’erreur provoquées par la modification de l’URL seront retournées au client. Par exemple, si la nouvelle URL n’existe pas, le serveur Web retourne une erreur HTTP 404.

Avertissement

La SetUrl méthode est appelée une fois que les paramètres initiaux de la demande ont été collectés, de sorte que le traitement ultérieur de la demande peut ignorer la modification de l’URL. Par exemple, la récupération de la variable de serveur d’URL reflète la demande d’origine, et non l’URL modifiée. Les implémenteurs doivent appeler la méthode IHttpContext::ExecuteRequest au lieu de SetUrl pour exécuter la demande via le pipeline complet. La SetUrl méthode ne doit pas être utilisée pour la réécriture d’URL.

Notes

Contrairement à la méthode IHttpResponse::Redirect , la SetUrl méthode ne redirige pas un client vers une nouvelle URL.

Notes

Vous devez appeler la SetUrl méthode avant le premier événement dans le pipeline de traitement des requêtes intégré HTTP. L’appel de la SetUrl méthode à partir d’un gestionnaire OnPostBeginRequest entraîne un comportement indéterminé.

Exemple

L’exemple de code suivant montre comment utiliser la SetUrl méthode pour remplacer une URL demandée par une autre 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
    );
}

Configuration requise

Type Description
Client - IIS 7.0 sur Windows Vista
- IIS 7.5 sur Windows 7
- IIS 8.0 sur Windows 8
- IIS 10.0 sur Windows 10
Serveur - IIS 7.0 sur Windows Server 2008
- IIS 7.5 sur Windows Server 2008 R2
- IIS 8.0 sur Windows Server 2012
- IIS 8.5 sur Windows Server 2012 R2
- IIS 10.0 sur Windows Server 2016
Produit - 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
En-tête Httpserv.h

 Voir aussi

IHttpRequest, interface
IHttpRequest::GetUrlChanged, méthode