none
如何用Frame通过http代理访问网页? RRS feed

答案

  • 我的网络环境下没有防火墙,我用C#修改注册表后用frame 去访问 www.ip.cn/   就可以看到是代理页面的结果。

               string url = "http://www.ip.cn/";
                StreamReader sr = null;
                string html = null;
                var proxyObject = new WebProxy("14.18.16.66", 80);
                var req = (HttpWebRequest)WebRequest.Create(url);
                req.Proxy = proxyObject;
                req.Timeout = 2000;
                req.ReadWriteTimeout = 2000;
                var resp = (HttpWebResponse)req.GetResponse();
                sr = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
                html = sr.ReadToEnd(); //返回的结果
    从返回的页面流里查看html也能看到是代理访问的结果页面,现在就是希望能通过设置frame的代理的方式让frame呈现通过代理显示的页面,我感觉frame是调用得本机IE的配置,有没有什么.net修改IE配置的方式(不通过注册表)。

    说实话,你重复说这些很没意思,不跟着我的思路走,两个人没法很快找到解决方案,还得我自己捉摸,我给你贴代码,你自己测试,我这里测试通过。

    public class IEProxy
        {
            private const int INTERNET_OPTION_PROXY = 38;
            private const int INTERNET_OPEN_TYPE_PROXY = 3;
            private const int INTERNET_OPEN_TYPE_DIRECT = 1;
    
            private string ProxyStr;
    
            [DllImport("wininet.dll", SetLastError = true)]
            private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);
    
            public struct Struct_INTERNET_PROXY_INFO
            {
                public int dwAccessType;
                public IntPtr proxy;
                public IntPtr proxyBypass;
            }
    
            private bool InternetSetOption(string strProxy)
            {
                int bufferLength;
                IntPtr intptrStruct;
                Struct_INTERNET_PROXY_INFO struct_IPI;
    
                if (string.IsNullOrEmpty(strProxy) || strProxy.Trim().Length == 0)
                {
                    strProxy = string.Empty;
                    struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_DIRECT;
                }
                else
                {
                    struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
                }
    
                struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy);
                struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local");
                bufferLength = Marshal.SizeOf(struct_IPI);
                intptrStruct = Marshal.AllocCoTaskMem(bufferLength);
                Marshal.StructureToPtr(struct_IPI, intptrStruct, true);
                return InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, bufferLength);
            }
    
            public IEProxy(string strProxy)
            {
                this.ProxyStr = strProxy;
            }
    
            //设置代理
            public bool RefreshIESettings()
            {
                return InternetSetOption(this.ProxyStr);
    
            }
    
            //取消代理
            public bool DisableIEProxy()
            {
                return InternetSetOption(string.Empty);
            }
        }
    
    
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            private IEProxy _proxy = new IEProxy("192.168.1.200:8080");
    
            public MainWindow()
            {
                InitializeComponent();
                
                bool proxySet = _proxy.RefreshIESettings();
                WebRequest.DefaultWebProxy = new WebProxy("192.168.1.200", 8080);
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                this.xFrame.Source = new Uri("http://www.ip.cn/");
            }
        }

    • 已标记为答案 MaJiXiang 2014年1月3日 7:36
    2014年1月3日 2:40

全部回复

  • 你可以看这个帖子: http://social.msdn.microsoft.com/Forums/vstudio/en-US/8e4b52ac-41f9-420d-92ab-306a3662382a/frame-control-and-proxy-authentication?forum=wpf

    WebProxy proxy = new WebProxy("proxyURI");
    proxy.BypassProxyOnLocal = true;
    NetworkCredential credentials = new NetworkCredential("username", "password");
    
    WebRequest.DefaultWebProxy = proxy;
    WebRequest.DefaultWebProxy.Credentials = credentials;
                
    frame.Source = new Uri(new Uri("basePath"),"relativePath");

    2013年12月26日 1:15
  • 兄弟,我试了你这种方式,不行呀,用frame加载的时候还是自己的Ip去访问,

    但是我这样写返回HTML是代理获取的

                string url = "http://www.ip.cn/";
                //StreamReader sr = null;
                //string html = null;
                var proxyObject = new WebProxy("14.18.16.66", 80);
                //proxyObject.BypassProxyOnLocal = true;
                //WebRequest.DefaultWebProxy = proxyObject;
                var req = (HttpWebRequest)WebRequest.Create(url);
                req.Proxy = proxyObject;
                req.Timeout = 2000;
                req.ReadWriteTimeout = 2000;
                var resp = (HttpWebResponse)req.GetResponse();
                frame.Source = new Uri(url);
                //sr = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
                //html = sr.ReadToEnd(); //返回的结果



    2014年1月2日 8:59
  • 兄弟,我试了你这种方式,不行呀,用frame加载的时候还是自己的Ip去访问,

    但是我这样写返回HTML是代理获取的

                string url = "http://www.ip.cn/";
                //StreamReader sr = null;
                //string html = null;
                var proxyObject = new WebProxy("14.18.16.66", 80);
                //proxyObject.BypassProxyOnLocal = true;
                //WebRequest.DefaultWebProxy = proxyObject;
                var req = (HttpWebRequest)WebRequest.Create(url);
                req.Proxy = proxyObject;
                req.Timeout = 2000;
                req.ReadWriteTimeout = 2000;
                var resp = (HttpWebResponse)req.GetResponse();
                frame.Source = new Uri(url);
                //sr = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
                //html = sr.ReadToEnd(); //返回的结果




    如果不行的话,建议你使用 Navigating 事件,通过 NavigatingCancelEventArgs 的 WebRequest 属性来设置代理。
    2014年1月2日 9:19
  • 您的意思是这样吗?可是不行呀

           private void frame_Navigating(object sender, System.Windows.Navigation.NavigatingCancelEventArgs e)
            {
                var proxyObject = new WebProxy("14.18.16.66", 80);
                proxyObject.BypassProxyOnLocal = true;
                WebRequest.DefaultWebProxy = proxyObject;
                e.WebRequest.Proxy = proxyObject;
            }

    我现在使用的是修改注册表的方式

                //打开注册表键 
                Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true);
                //设置代理可用 
                rk.SetValue("ProxyEnable", 1);
                //设置代理IP和端口 
                rk.SetValue("ProxyServer", "14.18.16.66:80");
                rk.Close();
                frame.Source = new Uri(url);
    有没有.net方式去配置的
    2014年1月2日 9:28
  • 您的意思是这样吗?可是不行呀

           private void frame_Navigating(object sender, System.Windows.Navigation.NavigatingCancelEventArgs e)
            {
                var proxyObject = new WebProxy("14.18.16.66", 80);
                proxyObject.BypassProxyOnLocal = true;
                WebRequest.DefaultWebProxy = proxyObject;
                e.WebRequest.Proxy = proxyObject;
            }

    我现在使用的是修改注册表的方式

                //打开注册表键 
                Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", true);
                //设置代理可用 
                rk.SetValue("ProxyEnable", 1);
                //设置代理IP和端口 
                rk.SetValue("ProxyServer", "14.18.16.66:80");
                rk.Close();
                frame.Source = new Uri(url);
    有没有.net方式去配置的

    WebRequest.DefaultWebProxy  = null;

    e.WebRequest.Proxy = new WebProxy("14.18.16.66", 80);

    2014年1月2日 9:46
  •         private void button1_Click(object sender, RoutedEventArgs e)
            {
                frame.Source = new Uri(http://www.ip.cn/);
            }
            private void frame_Navigating(object sender, System.Windows.Navigation.NavigatingCancelEventArgs e)
            {
                WebRequest.DefaultWebProxy = null;
                e.WebRequest.Proxy = new WebProxy("14.18.16.66", 80); ;
            }

    不行呀,还是获取的我本机IP
    2014年1月2日 9:55
  •         private void button1_Click(object sender, RoutedEventArgs e)
            {
                frame.Source = new Uri(http://www.ip.cn/);
            }
            private void frame_Navigating(object sender, System.Windows.Navigation.NavigatingCancelEventArgs e)
            {
                WebRequest.DefaultWebProxy = null;
                e.WebRequest.Proxy = new WebProxy("14.18.16.66", 80); ;
            }

    不行呀,还是获取的我本机IP

    是不是获取到本机 IP ,我不管,这同获取 IP 的方式有关系,我只是先确认请求没有代理发不出去。你这样测试:

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.ip.cn/");
    request.Proxy = new WebProxy("192.168.3.124",888);  // 这里给个无法连接的代理服务器
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    上面的代码会抛出异常,告诉你无法连接到服务器,因为我们给出的代理服务器是无法连接的。现在回到 Navigating 事件中,

    HttpWebRequest request = (HttpWebRequest)e.WebRequest;
    request.Proxy = new WebProxy("192.168.3.124", 888);
    HttpWebResponse response = (HttpWebResponse)e.WebRequest.GetResponse();

    同前一段代码没有多大差别,同样这里也应该抛出无法连接到服务器的异常,我本地测试需要触发某种条件才行,因此我怀疑它使用了某些默认设置,因此,如果你有防火墙的话,你应该将网址都屏蔽掉,然后所有访问都必须经过代理才可以,那么这样就可以检测出此代理设置是否有效,而不是虽然代理不可用,但是它还可以通过非代理通道访问。

    2014年1月2日 10:09
  • 我的网络环境下没有防火墙,我用C#修改注册表后用frame 去访问 www.ip.cn/   就可以看到是代理页面的结果。

               string url = "http://www.ip.cn/";
                StreamReader sr = null;
                string html = null;
                var proxyObject = new WebProxy("14.18.16.66", 80);
                var req = (HttpWebRequest)WebRequest.Create(url);
                req.Proxy = proxyObject;
                req.Timeout = 2000;
                req.ReadWriteTimeout = 2000;
                var resp = (HttpWebResponse)req.GetResponse();
                sr = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
                html = sr.ReadToEnd(); //返回的结果
    
    从返回的页面流里查看html也能看到是代理访问的结果页面,现在就是希望能通过设置frame的代理的方式让frame呈现通过代理显示的页面,我感觉frame是调用得本机IE的配置,有没有什么.net修改IE配置的方式(不通过注册表)。

    2014年1月2日 11:36
  • 我的网络环境下没有防火墙,我用C#修改注册表后用frame 去访问 www.ip.cn/   就可以看到是代理页面的结果。

               string url = "http://www.ip.cn/";
                StreamReader sr = null;
                string html = null;
                var proxyObject = new WebProxy("14.18.16.66", 80);
                var req = (HttpWebRequest)WebRequest.Create(url);
                req.Proxy = proxyObject;
                req.Timeout = 2000;
                req.ReadWriteTimeout = 2000;
                var resp = (HttpWebResponse)req.GetResponse();
                sr = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
                html = sr.ReadToEnd(); //返回的结果
    从返回的页面流里查看html也能看到是代理访问的结果页面,现在就是希望能通过设置frame的代理的方式让frame呈现通过代理显示的页面,我感觉frame是调用得本机IE的配置,有没有什么.net修改IE配置的方式(不通过注册表)。

    说实话,你重复说这些很没意思,不跟着我的思路走,两个人没法很快找到解决方案,还得我自己捉摸,我给你贴代码,你自己测试,我这里测试通过。

    public class IEProxy
        {
            private const int INTERNET_OPTION_PROXY = 38;
            private const int INTERNET_OPEN_TYPE_PROXY = 3;
            private const int INTERNET_OPEN_TYPE_DIRECT = 1;
    
            private string ProxyStr;
    
            [DllImport("wininet.dll", SetLastError = true)]
            private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);
    
            public struct Struct_INTERNET_PROXY_INFO
            {
                public int dwAccessType;
                public IntPtr proxy;
                public IntPtr proxyBypass;
            }
    
            private bool InternetSetOption(string strProxy)
            {
                int bufferLength;
                IntPtr intptrStruct;
                Struct_INTERNET_PROXY_INFO struct_IPI;
    
                if (string.IsNullOrEmpty(strProxy) || strProxy.Trim().Length == 0)
                {
                    strProxy = string.Empty;
                    struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_DIRECT;
                }
                else
                {
                    struct_IPI.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
                }
    
                struct_IPI.proxy = Marshal.StringToHGlobalAnsi(strProxy);
                struct_IPI.proxyBypass = Marshal.StringToHGlobalAnsi("local");
                bufferLength = Marshal.SizeOf(struct_IPI);
                intptrStruct = Marshal.AllocCoTaskMem(bufferLength);
                Marshal.StructureToPtr(struct_IPI, intptrStruct, true);
                return InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, intptrStruct, bufferLength);
            }
    
            public IEProxy(string strProxy)
            {
                this.ProxyStr = strProxy;
            }
    
            //设置代理
            public bool RefreshIESettings()
            {
                return InternetSetOption(this.ProxyStr);
    
            }
    
            //取消代理
            public bool DisableIEProxy()
            {
                return InternetSetOption(string.Empty);
            }
        }
    
    
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            private IEProxy _proxy = new IEProxy("192.168.1.200:8080");
    
            public MainWindow()
            {
                InitializeComponent();
                
                bool proxySet = _proxy.RefreshIESettings();
                WebRequest.DefaultWebProxy = new WebProxy("192.168.1.200", 8080);
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                this.xFrame.Source = new Uri("http://www.ip.cn/");
            }
        }

    • 已标记为答案 MaJiXiang 2014年1月3日 7:36
    2014年1月3日 2:40
  • 非常感谢,这个方式可以用
    2014年1月3日 7:36