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