WinHTTP AutoProxy Functions
A WinHTTP implementálja a WPAD protokollt a WinHttpGetProxyForUrlfüggvénnyel, valamint két segédfüggvénnyel, WinHttpDetectAutoProxyConfigUrl és WinHttpGetIEProxyConfigForCurrentUser.
Az AutoProxy-támogatás nincs teljesen integrálva a HTTP-verembe a WinHTTP-ban. A kérés elküldése előtt az alkalmazásnak meg kell hívnia WinHttpGetProxyForUrl, hogy lekérje egy proxykiszolgáló nevét, majd meghívja WinHttpSetOption a WINHTTP_OPTION_PROXY használatával a WinHttpOpenRequest által létrehozott WinHTTP-kéréskezelő proxykonfigurációjának beállításához.
A WinHttpGetProxyForUrl függvény az előző áttekintésben ismertetett WPAD protokoll mindhárom lépését végrehajthatja: (1) felderítheti a PAC URL-címét, (2) letöltheti a PAC-szkriptfájlt, (3) végrehajthatja a szkriptkódot, és visszaadhatja a proxykonfigurációt egy WINHTTP_PROXY_INFO struktúrában. Ha az alkalmazás előre tudja a PAC URL-címét, akkor ezt megadhatja a WinHttpGetProxyForUrl .
Az alábbi példakód autoproxyt használ. Beállít egy HTTP GET-kérést a WinHTTP-munkamenet-kapcsolat és a kéréskezelők létrehozásának első lépésével. A WinHttpOpen hívás megadja a kezdeti proxykonfiguráció WINHTTP_ACCESS_TYPE_NO_PROXY, amely jelzi, hogy a kérések alapértelmezés szerint közvetlenül a célkiszolgálóra érkeznek. Az autoproxy használatával a proxykonfigurációt közvetlenül a kérelemleíróra állítja be.
HINTERNET hHttpSession = NULL;
HINTERNET hConnect = NULL;
HINTERNET hRequest = NULL;
WINHTTP_AUTOPROXY_OPTIONS AutoProxyOptions;
WINHTTP_PROXY_INFO ProxyInfo;
DWORD cbProxyInfoSize = sizeof(ProxyInfo);
ZeroMemory( &AutoProxyOptions, sizeof(AutoProxyOptions) );
ZeroMemory( &ProxyInfo, sizeof(ProxyInfo) );
//
// Create the WinHTTP session.
//
hHttpSession = WinHttpOpen( L"WinHTTP AutoProxy Sample/1.0",
WINHTTP_ACCESS_TYPE_NO_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS,
0 );
// Exit if WinHttpOpen failed.
if( !hHttpSession )
goto Exit;
//
// Create the WinHTTP connect handle.
//
hConnect = WinHttpConnect( hHttpSession,
L"www.microsoft.com",
INTERNET_DEFAULT_HTTP_PORT,
0 );
// Exit if WinHttpConnect failed.
if( !hConnect )
goto Exit;
//
// Create the HTTP request handle.
//
hRequest = WinHttpOpenRequest( hConnect,
L"GET",
L"ms.htm",
L"HTTP/1.1",
WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES,
0 );
// Exit if WinHttpOpenRequest failed.
if( !hRequest )
goto Exit;
//
// Set up the autoproxy call.
//
// Use auto-detection because the Proxy
// Auto-Config URL is not known.
AutoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT;
// Use DHCP and DNS-based auto-detection.
AutoProxyOptions.dwAutoDetectFlags =
WINHTTP_AUTO_DETECT_TYPE_DHCP |
WINHTTP_AUTO_DETECT_TYPE_DNS_A;
// If obtaining the PAC script requires NTLM/Negotiate
// authentication, then automatically supply the client
// domain credentials.
AutoProxyOptions.fAutoLogonIfChallenged = TRUE;
//
// Call WinHttpGetProxyForUrl with our target URL. If
// auto-proxy succeeds, then set the proxy info on the
// request handle. If auto-proxy fails, ignore the error
// and attempt to send the HTTP request directly to the
// target server (using the default WINHTTP_ACCESS_TYPE_NO_PROXY
// configuration, which the requesthandle will inherit
// from the session).
//
if( WinHttpGetProxyForUrl( hHttpSession,
L"https://www.microsoft.com/ms.htm",
&AutoProxyOptions,
&ProxyInfo))
{
// A proxy configuration was found, set it on the
// request handle.
if( !WinHttpSetOption( hRequest,
WINHTTP_OPTION_PROXY,
&ProxyInfo,
cbProxyInfoSize ) )
{
// Exit if setting the proxy info failed.
goto Exit;
}
}
//
// Send the request.
//
if( !WinHttpSendRequest( hRequest,
WINHTTP_NO_ADDITIONAL_HEADERS,
0,
WINHTTP_NO_REQUEST_DATA,
0,
0,
NULL ) )
{
// Exit if WinHttpSendRequest failed.
goto Exit;
}
//
// Wait for the response.
//
if( !WinHttpReceiveResponse( hRequest, NULL ) )
goto Exit;
//
// A response has been received, then process it.
// (omitted)
//
Exit:
//
// Clean up the WINHTTP_PROXY_INFO structure.
//
if( ProxyInfo.lpszProxy != NULL )
GlobalFree(ProxyInfo.lpszProxy);
if( ProxyInfo.lpszProxyBypass != NULL )
GlobalFree( ProxyInfo.lpszProxyBypass );
//
// Close the WinHTTP handles.
//
if( hRequest != NULL )
WinHttpCloseHandle( hRequest );
if( hConnect != NULL )
WinHttpCloseHandle( hConnect );
if( hHttpSession != NULL )
WinHttpCloseHandle( hHttpSession );
A megadott példakódban a WinHttpGetProxyForUrlhívása arra utasítja a függvényt, hogy automatikusan felderítse a proxy automatikus konfigurációs fájlját a WINHTTP_AUTOPROXY_OPTIONS szerkezet WINHTTP_AUTOPROXY_AUTO_DETECT jelölőjének megadásával. A WINHTTP_AUTOPROXY_AUTO_DETECT jelző használatához a kódnak meg kell adnia az automatikus észlelési jelzők egyikét vagy mindkettőt (WINHTTP_AUTO_DETECT_TYPE_DHCP, WINHTTP_AUTO_DETECT_TYPE_DNS_A). A példakód a WinHttpGetProxyForUrl automatikus észlelési funkcióját használja, mivel a PAC URL-cím előre nem ismert. Ha ebben a forgatókönyvben nem található PAC URL-cím a hálózaton, WinHttpGetProxyForUrl meghiúsul (GetLastErrorERROR_WINHTTP_AUTODETECTION_FAILEDad vissza).
Ha a PAC URL-címe előre ismert
Ha az alkalmazás ismeri a PAC URL-címet, megadhatja azt a WINHTTP_AUTOPROXY_OPTIONS struktúrában, és konfigurálhatja WinHttpGetProxyForUrl az automatikus észlelési fázis kihagyásához.
Ha például egy PAC-fájl elérhető a helyi hálózaton a "https://InternalSite/proxy-config.pac" URL-címen, a WinHttpGetProxyForUrlhívása a következőnek fog kinézni.
//
// Set up the autoproxy call.
//
// The proxy auto-config URL is known. Auto-detection
// is not required.
AutoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL;
// Set the proxy auto-config URL.
AutoProxyOptions. lpszAutoConfigUrl = L"https://InternalSite/proxy-config.pac";
// If obtaining the PAC script requires NTLM/Negotiate
// authentication, then automatically supply the client
// domain credentials.
AutoProxyOptions.fAutoLogonIfChallenged = TRUE;
//
// Call WinHttpGetProxyForUrl with our target URL. If auto-proxy
// succeeds, then set the proxy info on the request handle.
// If auto-proxy fails, ignore the error and attempt to send the
// HTTP request directly to the target server (using the default
// WINHTTP_ACCESS_TYPE_NO_PROXY configuration, which the request
// handle will inherit from the session).
//
if( WinHttpGetProxyForUrl( hHttpSession,
L"https://www.microsoft.com/ms.htm",
&AutoProxyOptions,
&ProxyInfo ) )
{
//...
Ha a WINHTTP_AUTOPROXY_OPTIONS struktúra WINHTTP_AUTOPROXY_AUTO_DETECT és WINHTTP_AUTOPROXY_CONFIG_URL jelzőket is meghatároz (és automatikus detction jelzőket és automatikus konfigurációs URL-címet is megad), WinHttpGetProxyForUrl először megkísérli az automatikus észlelést, majd ha az automatikus észlelés nem találja a PAC URL-címet, "visszaesik" az alkalmazás által megadott automatikus konfigurációs URL-címre.
A WinHttpDetectAutoProxyConfigUrl függvény
A WinHttpDetectAutoProxyConfigUrl függvény a WPAD protokoll egy részhalmazát implementálja: a PAC-fájl letöltése vagy végrehajtása nélkül megpróbálja automatikusan észlelni a proxy automatikus konfigurációs fájlJÁNAK URL-címét. Ez a függvény olyan speciális helyzetekben hasznos, amikor egy webes ügyfélalkalmazásnak magának a PAC-fájlnak a letöltését és végrehajtását kell kezelnie.
A WinHttpGetIEProxyConfigForCurrentUser függvény
A WinHttpGetIEProxyConfigForCurrentUser függvény az aktuális aktív hálózati kapcsolat aktuális felhasználói Internet Explorer-proxybeállításait adja vissza anélkül, hogy betárcsázna a "WinInet.dll" parancsba. Ez a függvény csak akkor hasznos, ha interaktív felhasználói fiók identitása alatt futó folyamaton belül hívjuk meg, mert máskülönben valószínűleg nem lesz elérhető az Internet Explorer proxykonfigurációja. Nem lenne hasznos például meghívni ezt a függvényt az IIS szolgáltatásfolyamatban futó ISAPI DLL-ből. További információt és azt a forgatókönyvet, amelyben egy WinHTTP-alapú alkalmazás WinHttpGetIEProxyConfigForCurrentUserhasználna, tekintse meg felderítés automatikus konfigurációs fájl nélkül.