Cookiebehandlung in WinHTTP
HTTP-Sitzungsdaten werden zwischen dem Client und dem Server im Cookieheader der Anforderung oder der Antwort übergeben. Der Server sendet Cookies an den Client im Set-cookie-Header der Antwort, und die WinHTTP-API sendet das Servercooky im Cookie-Header der Anforderung erneut an den Server. Die in rfc 2109 (HTTP State Management Mechanism) beschriebenen Spezifikationen für die Cookiebehandlung werden standardmäßig in WinHTTP implementiert. Aktuelle Cookiebehandlungsspezifikationen, die in rfc 2964 beschrieben werden, werden von WinHTTP nicht unterstützt.
WinHTTP ruft das Cookie von den Servern Set-Cookie Headers ab und speichert es pro Sitzung in einem Cache. Dieses Cookie wird bei nachfolgenden Anforderungen in derselben WinHTTP-Sitzung erneut gesendet, in der das Ziel mit der Quelle des Cookies übereinstimmt. Die WinHTTP-API generiert den Anforderungscookiesheader für jede Etappe in der Anforderung neu.
In der folgenden Liste werden mehrere Optionen beschrieben, die WinHTTP-Clientanwendungen zum Verarbeiten von Cookies verwenden können:
- Automatische Cookiebehandlung: WinHTTP verarbeitet Cookies automatisch, und die Clientanwendung führt keine benutzerdefinierte Cookiebehandlung durch.
- Automatische Cookiebehandlung deaktivieren: Die automatische Cookiebehandlung in der WinHTTP-API ist deaktiviert, und es werden keine Cookies gesendet.
- Alle Cookies manuell angeben: Die automatische Cookiebehandlung ist deaktiviert, und die Clientanwendung fügt alle Cookie-Header für jede Anforderung in der Sitzung hinzu oder entfernt sie.
- Manuelle und automatische Cookiebehandlung: Kombinieren Sie die automatische und manuelle Cookie-Behandlung.
Deaktivieren der automatischen Cookieverarbeitung
Um die Cookiebehandlung zu deaktivieren, ruft die WinHTTP-Clientanwendung die WinHttpSetOption-Funktion auf, wobei der dwOption-Parameter auf WINHTTP_OPTION_DISABLE_FEATURE und der lpBuffer-Parameter auf WINHTTP_DISABLE_COOKIES festgelegt ist. Der hInternet-Parameter muss ein Anforderungshandle sein. Wenn die Cookiebehandlung für ein Anforderungshandle deaktiviert ist, das eine vorherige Anforderung gesendet hat, sollte der Client vorhandene Anforderungscookiesheader mit der WinHttpAddRequestHeaders-Funktion manuell entfernen, bevor die nächste Anforderung gesendet wird. Weitere Informationen finden Sie unter Entfernen von Cookieheadern.
Hinweis
Die Clientanwendung muss alle Cookies für die Sitzung festlegen, nachdem der automatische Modus deaktiviert wurde.
Manuelles Angeben aller Cookies
Wenn die automatische Cookiebehandlung deaktiviert ist, hat die WinHTTP-Clientanwendung die Möglichkeit, alle Cookies manuell anzugeben. Um das Cookie manuell festzulegen, ruft die Anwendung WinHttpAddRequestHeaders auf, die den Cookie-Header im pwszHeaders-Parameter angibt. Die Clientanwendung sollte alle Cookieheader löschen, bevor sie die Anforderung erneut senden.
Die Clientanwendung sollte auch den Cookieheader ändern, wenn die Anforderung umgeleitet wurde. Um das Cookie für umgeleitete Anforderungen zu ändern, gibt der Client eine Rückruffunktion mit WinHttpSetStatusCallback an, die auf den Umleitungsrückruffall reagiert. Der Rückrufhandler sollte das Cookie löschen, das zuvor für die Anforderung gesendet wurde, indem WinHttpAddRequestHeaders aufgerufen wird. Weitere Informationen zum Entfernen von Cookieheadern finden Sie unter Entfernen von Cookieheadern.
Manuelle und automatische Cookie-Behandlung
WinHTTP-Clientanwendungen können den automatischen Cookiebehandlungsmechanismus WinHTTP mit der manuellen Cookiebehandlung kombinieren. Die Anwendung fügt dem automatisch generierten Cookie-Header benutzerdefinierte Cookies hinzu, bevor die Anforderung mit der WinHttpSendRequest-Funktion gesendet wird. Das benutzerdefinierte Cookie sollte der erste Cookieheader in der Anforderung sein, dass die WinHTTP-API das Cookie ordnungsgemäß zwischenspeichert. Die Clientanwendung sollte auch Cookies entfernen, die bei früheren Anforderungen gesendet wurden, bevor eine Anforderung für dasselbe Anforderungshandle erneut gesendet wird. Weitere Informationen finden Sie unter Entfernen von Cookieheadern.
Cookies, die einer Anforderung vor dem Aufruf von WinHttpSendRequest hinzugefügt wurden, sind in allen WinHTTP-Anforderungen enthalten, die im Namen der nächsten WinHttpSendRequest - und WinHttpReceiveResponse-Aufrufe gesendet werden. Die Clientanwendung muss möglicherweise den Cookie-Header löschen, wenn die Anforderung umgeleitet wurde. Um das Cookie für umgeleitete Anforderungen zu löschen, gibt der Client eine Rückruffunktion mit WinHttpSetStatusCallback an, die auf den Umleitungsrückruffall reagiert. Der Rückrufhandler sollte das Cookie löschen, das zuvor für die Anforderung gesendet wurde, indem WinHttpAddRequestHeaders aufgerufen wird. Die Rückruffunktion legt möglicherweise keine neuen benutzerdefinierten Cookies für den Umleitungsrückruf fest. Der Client muss warten, bis WinHttpReceiveResponse abgeschlossen ist, bevor er neue Cookies für den nächsten WinHttpSendRequest-Aufruf hinzufügt.
Entfernen von Cookieheadern
Die WinHTTP-Clientanwendung muss möglicherweise das vorhandene Anforderungscooky löschen, bevor eine Anforderung erneut gesendet wird, um zu verhindern, dass Cookies, die bei früheren Anforderungen gesendet wurden, bei der aktuellen Anforderung erneut gesendet werden. Weitere Informationen finden Sie im folgenden Hinweis. Beachten Sie auch, dass Cookies nicht gelöscht werden müssen, bevor die erste Anforderung auf dem Anforderungshandle gesendet wird. Der Client kann vorhandene Cookies löschen, indem WinHttpAddRequestHeaders mit einem leeren Cookie-Header im pwszHeaders-Parameter und dem im dwModifier-Parameter festgelegten WINHTTP_ADDREQ_FLAG_REPLACE-Flag aufgerufen wird. Das folgende Codebeispiel zeigt, wie der Cookieheader für die Anforderung gelöscht wird.
WinHttpAddRequestHeaders(hRequest,
L"Cookie:",
-1,
WINHTTP_ADDREQ_FLAG_REPLACE);
Die WinHTTP-API weist unterschiedliche Cookiebehandlungsverhalten für Versionen des Betriebssystems vor Windows XP mit Service Pack 2 (SP2) und Windows Server 2003 mit Service Pack 1 (SP1) auf.
**Windows XP mit SP2 und höher und Windows Server 2003 mit SP1 und höher: **
Die WinHTTP-API löscht alle Cookies, die bei früheren Anforderungen für das Anforderungshandle gesendet wurden. Der Client kann vor jedem Aufruf von WinHttpSendRequest manuell neue Cookie-Header hinzufügen. Wenn die automatische Cookiebehandlungsfunktion der WinHTTP-API nicht deaktiviert wurde, fügt die WinHTTP-API den neuen Cookieheader (oder fügt einen neuen Cookieheader hinzu, wenn die Clientanwendung keinen manuell hinzugefügt hat) mit dem Cookie vom Server.
**Windows XP mit SP2 und Windows Server 2003 mit SP1: **
Die WinHTTP-API löscht den Anforderungscookiesheader nicht, nachdem WinHttpReceiveResponse abgeschlossen wurde. Cookies, die in früheren Anforderungen gesendet wurden, werden in nachfolgenden Aufrufen von WinHttpSendRequest erneut gesendet. Die WinHTTP-Clientanwendung sollte vorhandene Cookies-Header löschen, bevor sie eine Anforderung für das Anforderungshandle erneut senden.