Cookiebehandlung in WinHTTP
HTTP-Sitzungsdaten werden zwischen client und server im Cookieheader der Anforderung oder der Antwort übergeben. Der Server sendet Cookies im Set-cookie-Header der Antwort an den Client, und die WinHTTP-API sendet das Servercookie im Cookieheader der Anforderung erneut an den Server. Die Spezifikationen für die Cookieverarbeitung, die in rfc 2109 (HTTP State Management Mechanism) beschrieben werden, werden standardmäßig in WinHTTP implementiert. Aktuelle Spezifikationen zur Cookieverarbeitung, die in rfc 2964 beschrieben werden, werden von WinHTTP nicht unterstützt.
WinHTTP ruft das Cookie von den Servern Set-Cookie Header ab und speichert es sitzungsbezogen 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 Anforderungscookieheader für jeden Abschnitt in der Anforderung neu.
In der folgenden Liste werden mehrere Optionen beschrieben, mit denen WinHTTP-Clientanwendungen Cookies verarbeiten können:
- Automatische Cookiebehandlung: WinHTTP verarbeitet Cookies automatisch, und die Clientanwendung führt keine benutzerdefinierte Cookieverarbeitung durch.
- Deaktivieren der automatischen Cookiebehandlung: Die automatische Cookiebehandlung in der WinHTTP-API ist deaktiviert, und es werden keine Cookies gesendet.
- Manuelles Angeben aller Cookies: Die automatische Cookieverarbeitung ist deaktiviert, und die Clientanwendung fügt alle Cookieheader für jede Anforderung in der Sitzung hinzu oder entfernt sie.
- Manuelle und automatische Cookiebehandlung: Kombinieren Sie die automatische und manuelle Cookieverarbeitung.
Deaktivieren der automatischen Cookiebehandlung
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 kann entweder ein Sitzungshandle oder ein Anforderungshandle sein. Wenn die Cookieverarbeitung für ein Anforderungshandle deaktiviert ist, das eine vorherige Anforderung gesendet hat, sollte der Client vorhandene Anforderungscookieheader mit der WinHttpAddRequestHeaders-Funktion manuell entfernen, bevor er die nächste Anforderung sendet. Weitere Informationen finden Sie unter Entfernen von Cookieheadern.
Hinweis Die Clientanwendung muss alle Cookies in der Sitzung festlegen, nachdem der automatische Modus deaktiviert wurde.
Manuelles Angeben aller Cookies
Wenn die automatische Cookieverarbeitung deaktiviert ist, kann die WinHTTP-Clientanwendung alle Cookies manuell angeben. Um das Cookie manuell festzulegen, ruft die Anwendung WinHttpAddRequestHeaders auf und gibt den Cookieheader im pwszHeaders-Parameter an. Die Clientanwendung sollte vor dem erneuten Senden der Anforderung alle Cookieheader löschen.
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 durch Aufrufen von WinHttpAddRequestHeadersan die Anforderung gesendet wurde. Weitere Informationen zum Entfernen von Cookieheadern finden Sie unter Entfernen von Cookieheadern.
Manuelle und automatische Cookieverarbeitung
WinHTTP-Clientanwendungen können den automatischen WinHTTP-Cookiebehandlungsmechanismus mit der manuellen Cookiebehandlung kombinieren. Die Anwendung fügt dem automatisch generierten Cookieheader 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 vorherigen 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 Auftrag der nächsten WinHttpSendRequest- und WinHttpReceiveResponse-Aufrufe gesendet werden. Die Clientanwendung muss möglicherweise den Cookieheader 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 durch Aufrufen von WinHttpAddRequestHeadersan die Anforderung gesendet wurde. 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 neue Cookies für den nächsten WinHttpSendRequest-Aufruf hinzugefügt werden.
Entfernen von Cookieheadern
Die WinHTTP-Clientanwendung muss möglicherweise das vorhandene Anforderungscookie löschen, bevor eine Anforderung erneut gesendet wird, um zu verhindern, dass Cookies, die bei vorherigen Anforderungen gesendet wurden, in der aktuellen Anforderung erneut gesendet werden. Weitere Informationen finden Sie im folgenden Hinweis. Beachten Sie außerdem, dass Cookies nicht gelöscht werden müssen, bevor die erste Anforderung an das Anforderungshandle gesendet wird. Der Client kann vorhandene Cookies löschen, indem er WinHttpAddRequestHeaders mit einem leeren Cookieheader im pwszHeaders-Parameter und dem _ WINHTTP ADDREQ FLAG REPLACE-Flag aufruft, _ das im _ dwModifier-Parameter festgelegt ist. Im folgenden Codebeispiel wird veranschaulicht, wie der Cookieheader für die Anforderung gelöscht wird.
WinHttpAddRequestHeaders( hRequest,
L"Cookie:",
-1,
WINHTTP_ADDREQ_FLAG_REPLACE);
Die WinHTTP-API weist unterschiedliche Verhalten bei der Cookiebehandlung für Versionen des Betriebssystems vor als Windows XP mit Service Pack 2 (SP2) und Windows Server 2003 mit Service Pack 1 (SP1).
**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 vorherigen Anforderungen für das Anforderungshandle gesendet wurden. Der Client kann vor jedem Aufruf von WinHttpSendRequest manuell neue Cookieheader hinzufügen. Wenn die automatische Cookiebehandlungsfunktion der WinHTTP-API nicht deaktiviert wurde, fügt die WinHTTP-API den neuen Cookieheader an (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 Anforderungscookieheader nicht, nachdem WinHttpReceiveResponse abgeschlossen wurde. Cookies, die in vorherigen Anforderungen gesendet wurden, werden in nachfolgenden Aufrufen von WinHttpSendRequesterneut gesendet. Die WinHTTP-Clientanwendung sollte vorhandene Cookiesheader löschen, bevor eine Anforderung für das Anforderungshandle erneut gesendet wird.