我在我的应用程序中使用.net WebBrowser进行Web浏览,因为我知道控件基于IE因此设置代理我正在寻找如何配置IE代理设置。想出了以下代码的pinvoke InternetSetOption:
private void SetIESettings(string proxy)
{
const int INTERNET_OPTION_PROXY = 38;
const int INTERNET_OPEN_TYPE_PROXY = 3;
Struct_INTERNET_PROXY_INFO struct_IPI;
struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
struct_IPI.proxy = Marshal.StringToHGlobalAnsi(proxy);
struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local");
IntPtr intptrStruct = Marshal.AllocCoTaskMem(Marshal.SizeOf(struct_IPI));
Marshal.StructureToPtr(struct_IPI, intptrStruct, true);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, Marshal.SizeOf(struct_IPI));
}
像魅力一样工作,在设置代理后,控件会通过它。代理需要凭证的东西,在通过它之前需要给出用户名和传递。我试图为webBrowser.Navigate方法添加额外的标题,如下所示:
var credentialStringValue = "user:password";
var credentialByteArray = ASCIIEncoding.ASCII.GetBytes(credentialStringValue);
var credentialBase64String = Convert.ToBase64String(credentialByteArray);
var credentials = string.Format("Authorization: Basic {0}{1}", credentialBase64String, Environment.NewLine);
然后调用导航
webBrowser.Navigate("http://google.com", "", null, credentials);
没有帮助,仍然获得身份验证表单。还尝试添加具有相同值的Proxy-Authorization标头,但仍然没有。
还尝试设置用户并传递Internet Explorer选项,如下所示:
const int INTERNET_OPTION_USERNAME = 28;
const int INTERNET_OPTION_PASSWORD = 29;
var uesr = "user";
var pass = "password";
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_USERNAME, uesr, uesr.Length + 1);
InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PASSWORD, pass, pass.Length + 1);
仍然无法正常工作,安全窗口不断弹出。 显然我做错了什么,有什么建议吗?
答案 0 :(得分:0)
你的方向是对的。我在使用IE comobject时遇到了这个问题
0x800C000E
以下MS KB详细说明了IE不支持URL地址中的用户名和密码的原因。我试图在KB中添加注册表,解决了我的问题。
创建注册表
HKEY_LOCAL_MACHINE \ SOFTWARE \微软\互联网 资源管理器\主\ FeatureControl \ FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
添加一个DWORD值" iexplore.exe"和数据设置为" 0"
关于您的情况,我认为您只需创建一个指向您的应用的值并将数据设置为" 0"就像" iexplore.exe"并使用以下URL格式。