Udostępnij za pośrednictwem


Funkcje Autoproxy WinHTTP

WinHTTP implementuje protokół WPAD przy użyciu funkcjiWinHttpGetProxyForUrl wraz z dwiema pomocniczymi funkcjami narzędziowymi, WinHttpDetectAutoProxyConfigUrl i WinHttpGetIEProxyConfigForCurrentUser.

Obsługa rozwiązania AutoProxy nie jest w pełni zintegrowana ze stosem HTTP w usłudze WinHTTP. Przed wysłaniem żądania aplikacja musi wywołać WinHttpGetProxyForUrl, aby uzyskać nazwę serwera proxy, a następnie wywołać WinHttpSetOption przy użyciu WINHTTP_OPTION_PROXY, aby ustawić konfigurację serwera proxy na dojściu żądania WinHTTP utworzonym przez WinHttpOpenRequest.

Funkcja WinHttpGetProxyForUrl może wykonać wszystkie trzy kroki protokołu WPAD opisanego w poprzednim omówieniu: (1) odnajdywanie adresu URL PAC, (2) pobranie pliku skryptu PAC, (3) wykonanie kodu skryptu i zwrócenie konfiguracji serwera proxy w strukturze WINHTTP_PROXY_INFO. Opcjonalnie, jeśli aplikacja wie z wyprzedzeniem adres URL PAC, może określić to, aby WinHttpGetProxyForUrl.

Poniższy przykładowy kod używa autoproxy. Konfiguruje żądanie HTTP GET, tworząc najpierw połączenie sesji WinHTTP i dojścia żądań. Wywołanie WinHttpOpen określa WINHTTP_ACCESS_TYPE_NO_PROXY początkowej konfiguracji serwera proxy, aby wskazać, że żądania są domyślnie wysyłane bezpośrednio do serwera docelowego. Przy użyciu autoproxy ustawia konfigurację serwera proxy bezpośrednio na dojściu żądania.

  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 );

W podanym przykładowym kodzie wywołanie metody WinHttpGetProxyForUrl instruuje funkcję, aby wykryła plik automatycznej konfiguracji serwera proxy, określając flagę WINHTTP_AUTOPROXY_AUTO_DETECT w strukturze WINHTTP_AUTOPROXY_OPTIONS. Użycie flagi WINHTTP_AUTOPROXY_AUTO_DETECT wymaga, aby kod określał jedną lub obie flagi wykrywania automatycznego (WINHTTP_AUTO_DETECT_TYPE_DHCP, WINHTTP_AUTO_DETECT_TYPE_DNS_A). Przykładowy kod używa funkcji automatycznego wykrywania WinHttpGetProxyForUrl, ponieważ adres URL PAC nie jest wcześniej znany. Jeśli w tym scenariuszu nie można znaleźć adresu URL PAC, WinHttpGetProxyForUrl kończy się niepowodzeniem (GetLastError zwraca ERROR_WINHTTP_AUTODETECTION_FAILED).

Jeśli adres URL pac jest znany z wyprzedzeniem

Jeśli aplikacja zna adres URL PAC, może określić ją w strukturze WINHTTP_AUTOPROXY_OPTIONS i skonfigurować WinHttpGetProxyForUrl, aby pominąć fazę automatycznego wykrywania.

Jeśli na przykład plik PAC jest dostępny w sieci lokalnej pod adresem URL "https://InternalSite/proxy-config.pac", wywołanie WinHttpGetProxyForUrl będzie wyglądać następująco.

//
// 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 ) )
{
  //...

Jeśli struktura WINHTTP_AUTOPROXY_OPTIONS określa zarówno flagi WINHTTP_AUTOPROXY_AUTO_DETECT, jak i WINHTTP_AUTOPROXY_CONFIG_URL (i określa flagi automatycznego detction i adres URL automatycznej konfiguracji), WinHttpGetProxyForUrl pierwsze próby automatycznego wykrywania, a następnie, jeśli automatyczne wykrywanie nie może zlokalizować adresu URL PAC, "wraca" do adresu URL konfiguracji automatycznej dostarczonej przez aplikację.

Funkcja WinHttpDetectAutoProxyConfigUrl

Funkcja WinHttpDetectAutoProxyConfigUrl implementuje podzestaw protokołu WPAD: próbuje automatycznie wykryć adres URL pliku automatycznej konfiguracji serwera proxy bez pobierania lub wykonywania pliku PAC. Ta funkcja jest przydatna w szczególnych sytuacjach, w których aplikacja kliencka sieci Web musi obsługiwać pobieranie i wykonywanie samego pliku PAC.

Funkcja WinHttpGetIEProxyConfigForCurrentUser

Funkcja WinHttpGetIEProxyConfigForCurrentUser zwraca bieżące ustawienia serwera proxy programu Internet Explorer dla bieżącego aktywnego połączenia sieciowego bez wywoływania polecenia "WinInet.dll". Ta funkcja jest przydatna tylko wtedy, gdy jest wywoływana w ramach procesu uruchomionego w ramach tożsamości interaktywnego konta użytkownika, ponieważ w przeciwnym razie nie będzie dostępna żadna konfiguracja serwera proxy programu Internet Explorer. Na przykład nie byłoby przydatne wywołanie tej funkcji z biblioteki DLL ISAPI uruchomionej w procesie usługi IIS. Aby uzyskać więcej informacji i scenariusz, w którym aplikacja oparta na winHTTP będzie używać WinHttpGetIEProxyConfigForCurrentUser, zobacz Odnajdywanie bez pliku autokonfiguracji.