IHttpRequest::SetUrl-Methode
Ändert die Anforderungs-URL.
Syntax
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;
Parameter
pszUrl
[IN] Ein Zeiger auf eine Zeichenfolge, die die festzulegende URL enthält.
cchUrl
[IN] Die Länge der von pszUrl
angegebenen URL in Zeichen.
fResetQueryString
[IN] true
, um die vorhandene Abfragezeichenfolge zurückzusetzen; false
andernfalls .
Rückgabewert
HRESULT
. Mögliches Werte (aber nicht die Einzigen) sind die in der folgenden Tabelle.
Wert | BESCHREIBUNG |
---|---|
S_OK | Gibt an, dass der Vorgang erfolgreich war. |
ERROR_INVALID_PARAMETER | Gibt an, dass der angegebene Parameter ungültig ist (z. B. ist die angegebene URL zu lang). |
ERROR_NOT_ENOUGH_MEMORY | Gibt an, dass nicht genügend Arbeitsspeicher zum Ausführen des Vorgangs vorhanden ist. |
Hinweise
Die SetUrl
-Methode ändert die URL für die aktuelle Anforderung. Es gibt zwei überladene Versionen der SetUrl
-Methode. Mit einer können Sie den Header angeben, indem Sie einen Zeiger auf eine Zeichenfolge verwenden. Die andere Überladung verwendet einen Zeiger auf eine breite Zeichenfolge.
Nachfolgende Anforderungsverarbeitungsfunktionen und Protokollierungsvorgänge verarbeiten die neue URL so, als ob der Client die URL angefordert hätte. Daher werden alle Fehlerbedingungen, die durch das Ändern der URL verursacht werden, an den Client zurückgegeben. Wenn die neue URL beispielsweise nicht vorhanden ist, gibt der Webserver einen HTTP 404-Fehler zurück.
Warnung
Die SetUrl
-Methode wird aufgerufen, nachdem die anfänglichen Parameter für die Anforderung erfasst wurden, sodass die geänderte URL bei der nachfolgenden Anforderungsverarbeitung möglicherweise nicht bekannt ist. Beispielsweise entspricht das Abrufen der URL-Servervariablen der ursprünglichen Anforderung, nicht der geänderten URL. Implementierer sollten anstelle von SetUrl
die IHttpContext::ExecuteRequest-Methode aufrufen, um die Anforderung über die vollständige Pipeline auszuführen. Die SetUrl
-Methode sollte nicht zum Umschreiben von URLs verwendet werden.
Hinweis
Im Gegensatz zur IHttpResponse::Redirect-Methode leitet die SetUrl
Methode einen Client nicht an eine neue URL um.
Hinweis
Sie müssen die SetUrl
-Methode vor dem ersten Ereignis in der integrierten HTTP-Anforderungsverarbeitungspipeline aufrufen. Das Aufrufen der SetUrl
-Methode von einem OnPostBeginRequest-Handler führt zu einem unbestimmten Verhalten.
Beispiel
Im folgenden Codebeispiel wird veranschaulicht, wie Sie die SetUrl
-Methode verwenden, um eine angeforderte URL in eine andere URL zu ändern.
#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
);
}
Anforderungen
Typ | BESCHREIBUNG |
---|---|
Client | – IIS 7.0 unter Windows Vista – IIS 7.5 unter Windows 7 – IIS 8.0 unter Windows 8 – IIS 10.0 unter Windows 10 |
Server | – IIS 7.0 unter Windows Server 2008 – IIS 7.5 unter Windows Server 2008 R2 – IIS 8.0 auf Windows Server 2012 – IIS 8.5 auf Windows Server 2012 R2 – IIS 10.0 unter Windows Server 2016 |
Produkt | – 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 |
Header | Httpserv.h |
Weitere Informationen
IHttpRequest-Schnittstelle
IHttpRequest::GetUrlChanged-Methode