Здравствуйте, я хочу установить прокси-сервер IE с помощью программы C #, поскольку класс WebProxy имеет метод получения прокси. Но нет способа установить его!

2
user460195 7 Мар 2011 в 08:52

1 ответ

Вот несколько альтернатив, найденных гуглом:

1- Глобальный выбор прокси

Это с сайта http://www.hccp.org/csharp-http-proxy.html.

Образец кода:

System.Net.Uri proxyURI = new System.Net.Uri("http://64.202.165.130:3128");
System.Net.GlobalProxySelection.Select = new System.Net.WebProxy(proxyURI);

2- Еще одно обсуждение StackOverflow: Программно установить настройки прокси-сервера браузера в C#

Прочтите его, если вы хотите использовать прокси только для своего приложения.

Для глобальных изменений предлагается посмотреть: http://msdn.microsoft.com /en-us/library/aa384113.aspx

Образец кода:

WINHTTP_PROXY_INFO proxyInfo;

// Allocate memory for string members.
proxyInfo.lpszProxy = new WCHAR[25];
proxyInfo.lpszProxyBypass = new WCHAR[25];

// Set the members of the proxy info structure.
proxyInfo.dwAccessType = WINHTTP_ACCESS_TYPE_NAMED_PROXY;
swprintf_s(proxyInfo.lpszProxy, 25, L"proxy_server");
swprintf_s(proxyInfo.lpszProxyBypass, 25, L"<local>");

// Set the default proxy configuration.
if (WinHttpSetDefaultProxyConfiguration( &proxyInfo ))
    printf("Proxy Configuration Set.\n");

// Free memory allocated to the strings.
delete [] proxyInfo.lpszProxy;
delete [] proxyInfo.lpszProxyBypass;

3- Использование собственного кода

Это из http://huddledmasses.org/setting-windows- прокси-подключение к Интернету из-c/

Образец кода:

using System;
using System.Runtime.InteropServices;
using System.ComponentModel;

namespace PoshHttp
{
   public class Proxies
   {
      public static bool UnsetProxy()
      {
         return SetProxy(null, null);
      }
      public static bool SetProxy(string strProxy)
      {
         return SetProxy(strProxy, null);
      }

      public static bool SetProxy(string strProxy, string exceptions)
      {
         InternetPerConnOptionList list = new InternetPerConnOptionList();

         int optionCount = string.IsNullOrEmpty(strProxy) ? 1 : (string.IsNullOrEmpty(exceptions) ? 2 : 3);
         InternetConnectionOption[] options = new InternetConnectionOption[optionCount];
         // USE a proxy server ...
         options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS;
         options[0].m_Value.m_Int = (int)((optionCount < 2) ? PerConnFlags.PROXY_TYPE_DIRECT : (PerConnFlags.PROXY_TYPE_DIRECT | PerConnFlags.PROXY_TYPE_PROXY));
         // use THIS proxy server
         if (optionCount > 1)
         {
            options[1].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_SERVER;
            options[1].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(strProxy);
            // except for these addresses ...
            if (optionCount > 2)
            {
               options[2].m_Option = PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS;
               options[2].m_Value.m_StringPtr = Marshal.StringToHGlobalAuto(exceptions);
            }
         }

         // default stuff
         list.dwSize = Marshal.SizeOf(list);
         list.szConnection = IntPtr.Zero;
         list.dwOptionCount = options.Length;
         list.dwOptionError = 0;


         int optSize = Marshal.SizeOf(typeof(InternetConnectionOption));
         // make a pointer out of all that ...
         IntPtr optionsPtr = Marshal.AllocCoTaskMem(optSize * options.Length);
         // copy the array over into that spot in memory ...
         for (int i = 0; i < options.Length; ++i)
         {
            IntPtr opt = new IntPtr(optionsPtr.ToInt32() + (i * optSize));
            Marshal.StructureToPtr(options[i], opt, false);
         }

         list.options = optionsPtr;

         // and then make a pointer out of the whole list
         IntPtr ipcoListPtr = Marshal.AllocCoTaskMem((Int32)list.dwSize);
         Marshal.StructureToPtr(list, ipcoListPtr, false);

         // and finally, call the API method!
         int returnvalue = NativeMethods.InternetSetOption(IntPtr.Zero,
            InternetOption.INTERNET_OPTION_PER_CONNECTION_OPTION, 
            ipcoListPtr, list.dwSize) ? -1 : 0;
         if (returnvalue == 0)
         {  // get the error codes, they might be helpful
            returnvalue = Marshal.GetLastWin32Error();
         }
         // FREE the data ASAP
         Marshal.FreeCoTaskMem(optionsPtr);
         Marshal.FreeCoTaskMem(ipcoListPtr);
         if (returnvalue > 0)
         {  // throw the error codes, they might be helpful
            throw new Win32Exception(Marshal.GetLastWin32Error());
         }

         return (returnvalue < 0);
      }
   }

   #region WinInet structures
   [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
   public struct InternetPerConnOptionList
   {
      public int dwSize;               // size of the INTERNET_PER_CONN_OPTION_LIST struct
      public IntPtr szConnection;         // connection name to set/query options
      public int dwOptionCount;        // number of options to set/query
      public int dwOptionError;           // on error, which option failed
      //[MarshalAs(UnmanagedType.)]
      public IntPtr options;
   };

   [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
   public struct InternetConnectionOption
   {
      static readonly int Size;
      public PerConnOption m_Option;
      public InternetConnectionOptionValue m_Value;
      static InternetConnectionOption()
      {
         InternetConnectionOption.Size = Marshal.SizeOf(typeof(InternetConnectionOption));
      }

      // Nested Types
      [StructLayout(LayoutKind.Explicit)]
      public struct InternetConnectionOptionValue
      {
         // Fields
         [FieldOffset(0)]
         public System.Runtime.InteropServices.ComTypes.FILETIME m_FileTime;
         [FieldOffset(0)]
         public int m_Int;
         [FieldOffset(0)]
         public IntPtr m_StringPtr;
      }
   }
   #endregion

   #region WinInet enums
   //
   // options manifests for Internet{Query|Set}Option
   //
   public enum InternetOption : uint
   {
      INTERNET_OPTION_PER_CONNECTION_OPTION = 75
   }

   //
   // Options used in INTERNET_PER_CONN_OPTON struct
   //
   public enum PerConnOption
   {
      INTERNET_PER_CONN_FLAGS = 1, // Sets or retrieves the connection type. The Value member will contain one or more of the values from PerConnFlags 
      INTERNET_PER_CONN_PROXY_SERVER = 2, // Sets or retrieves a string containing the proxy servers.  
      INTERNET_PER_CONN_PROXY_BYPASS = 3, // Sets or retrieves a string containing the URLs that do not use the proxy server.  
      INTERNET_PER_CONN_AUTOCONFIG_URL = 4//, // Sets or retrieves a string containing the URL to the automatic configuration script.  

   }

   //
   // PER_CONN_FLAGS
   //
   [Flags]
   public enum PerConnFlags
   {
      PROXY_TYPE_DIRECT = 0x00000001,  // direct to net
      PROXY_TYPE_PROXY = 0x00000002,  // via named proxy
      PROXY_TYPE_AUTO_PROXY_URL = 0x00000004,  // autoproxy URL
      PROXY_TYPE_AUTO_DETECT = 0x00000008   // use autoproxy detection
   }
   #endregion

   internal static class NativeMethods
   {
      [DllImport("WinInet.dll", SetLastError = true, CharSet = CharSet.Auto)]
      [return: MarshalAs(UnmanagedType.Bool)]
      public static extern bool InternetSetOption(IntPtr hInternet, InternetOption dwOption, IntPtr lpBuffer, int dwBufferLength);
   }
}

Пожалуйста, проверьте сами ссылки для получения подробной информации и полных частей решений.

2
Community 23 Май 2017 в 15:06
Спасибо, я использую решение 2, но не устанавливайте для меня прокси в Windows7. Я хочу установить прокси для всех браузеров в win7, могу ли я использовать решение 3?
 – 
Niloo
8 Янв 2014 в 09:58
Решение 2 предназначено для прокси-сервера для конкретного приложения, а не для глобального. Попробуйте решение 1. Обратите внимание, что Chrome использует прокси-сервер IE, а Firefox имеет возможность использовать прокси-сервер IE (называет его «системным» прокси-сервером) или установить свой собственный.
 – 
Meligy
9 Янв 2014 в 02:45