Freigeben über


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 pszUrlangegebenen URL in Zeichen.

fResetQueryString
[IN] true , um die vorhandene Abfragezeichenfolge zurückzusetzen; falseandernfalls .

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