在C#中使用Wininet设置代理用户名和密码这是StackOverflow中的第一题。我从这个网站得到了很大的帮助。我正在.NET2010上开发C#应用程序。我正在尝试为http请求设置一个系统范围的代理服务器。ProxyServer是一个基于Squid的代理,启用了“基本”身份验证。我已经能够为IE设置代理。现在在IE中设置代理后,IE要求提供代理的用户名和密码,现在我正在尝试自动执行此操作,并且在过去的一周里我无法让它工作并且一直在搜索互联网没有成功。下面是我用来设置IE代理的代码。publicstaticboolSetProxy(stringstrProxy,stringusername,stringpassword,stringexceptions){InternetPerConnOptionListlist=newInternetPerConnOptionList();intoptionCount=string.IsNullOrEmpty(strProxy)?1:(string.IsNullOrEmpty(exceptions)?2:3);InternetConnectionOption[]options=newInternetConnectionOption[optionCount];//使用代理服务器...options[0].m_Option=PerConnOption.INTERNET_PER_CONN_FLAGS;options[0].m_Value.m_Int=(int)((optionCount1){options[1].m_Option=PerConnOption.INTERNET_PER_CONN_PROXY_SERVER;options[1].m_Value.m_StringPtr=Marshal.StringToHGlobalAuto(strProxy);//除了这些addresses...if(optionCount>2){options[2].m_Option=PerConnOption.INTERNET_PER_CONN_PROXY_BYPASS;options[2].m_Value.m_StringPtr=Marshal.StringToHGlobalAuto(exceptions);}}//默认内容list.dwSize=Marshal.SizeOf(列表);list.szConnection=IntPtr.Zero;list.dwOptionCount=options.Length;list.dwOptionError=0;intoptSize=Marshal.SizeOf(typeof(InternetConnectionOption));//从所有这些中创建一个指针...IntPtroptionsPtr=Marshal.AllocCoTaskMem(optSize*options.Length);//将数组复制到内存中的那个位置...for(inti=0;i0){//抛出错误代码,它们可能会有帮助thrownewWin32Exception(Marshal.GetLastWin32Error());}返回(返回值<0);}}#regionWinInet结构[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]publicstructInternetPerConnOptionList{publicintdwSize;//INTERNET_PER_CONN_OPTION_LIST结构的大小publicIntPtrszConnection;//设置/查询选项的连接名称publicintdwOptionCount;//要设置/查询的选项数publicintdwOptionError;//出错时,哪个选项失败//[MarshalAs(UnmanagedType.)]publicIntPtroptions;};[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]publicstructInternetConnectionOption{staticreadonlyint大小;公共PerConnOptionm_Option;公共InternetConnectionOptionValuem_Value;静态InternetConnectionOption(){InternetConnectionOption.Size=Marshal.SizeOf(typeof(InternetConnectionOption));}//嵌套类型[StructLayout(LayoutKind.Explicit)]publicstructInternetConnectionOptionValue{//字段[FieldOffset(0)]publicSystem.Runtime.InteropServices.ComTypes.FILETIMEm_FileTime;[FieldOffset(0)]publicintm_Int;[FieldOffset(0)]publicIntPtrm_StringPtr;}}#endregion#regionWinInetenums////Internet{查询|设置}选项的选项清单//publicenumInternetOption:uint{INTERNET_OPTION_PER_CONNECTION_OPTION=75}////INTERNET_PER_CONN_OPTON结构中使用的选项//publicenumPerConnOption{INTERNET_PER_CONN_FLAGS=1,//设置或检索连接类型。Value成员将包含来自PerConnFlags的一个或多个值INTERNET_PER_CONN_PROXY_SERVER=2,//设置或检索字符串con染色代理服务器。INTERNET_PER_CONN_PROXY_BYPASS=3,//设置或检索包含不使用代理服务器的URL的字符串。INTERNET_PER_CONN_AUTOCONFIG_URL=4//,//设置或检索包含自动配置URL的字符串}脚本。////PER_CONN_FLAGS//[Flags]publicenumPerConnFlags{PROXY_TYPE_DIRECT=0x00000001,//directtonetPROXY_TYPE_PROXY=0x00000002,//vianamedproxyPROXY_TYPE_AUTO_PROXY_URL=0x00000004,//autoproxyURLPROXY_TYPE_AUTO_DETECT=0x00000008//useautoproxydetection}#endregion内部静态类NativeMethods{[DllImport("WinInet.dll",SetLastError=true,CharSet=CharSet.Auto)][返回:MarshalAs(UnmanagedType.Bool)]publicstaticexternboolInternetSetOption(IntPtrhInternet,InternetOptiondwOption,IntPtrlpBuffer,intdwBufferLength);任何帮助让它工作的人都将不胜感激真诚的,MudasirMirza。当您为WinINET设置代理时,无法存储所有客户端都将从中受益的“全局”代理用户名和密码。您只能在每个进程的基础上缓存此用户名/密码。在此过程中,您可以使用InternetSetOptionAPI提供用户名和密码。这仅为WinINET设置密码,不为.NET或其他HTTP堆栈设置密码。查看WebProxy类,看看它是否允许您做您想做的事?按以下方式使用它(我假设异常由“;”分隔):;字符串[]bypassList=null;如果(!string.IsNullOrEmpty(exceptions)){bypassList=exceptions.Split(';');}WebRequest.DefaultWebProxy=newWebProxy(proxyAddress,true,bypassList,credential);}调用方法:SetProxy("http://proxy:8080","user","password","http://site1;http://site2");在处理身份验证和烦人的“Windows安全”窗口时,我遇到了WebBrowser的问题。类似的控件问题。首先,使用WinINET设置代理地址,然后使用您的凭据调用导航方法。它有助于为每个进程存储代理凭据:WebBrowser.Navigate("http://user:pass@geoip.hidemyass.com/");WinINET方法设置了完美的代理地址,但是您的代码使用了INTERNET_OPTION_PER_CONNECTION_OPTION,这不适合您的“全局代理”想法(如@EricLaw所述)。尝试使用INTERNET_OPTION_PROXY(documentaion)此外,有四种不同的方法,没有直接的解决方案。但是它们很方便。以上就是C#学习教程:使用Wininet在C#中设置代理用户名和密码分享全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络合集,不代表任何内容,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
