为普通Windows应用程序启用代理验证

时间:2010-05-20 11:41:27

标签: .net windows configuration proxy

我公司的互联网在带有身份验证的代理服务器上运行(即每当我尝试访问任何网页时,浏览器会提示用户名/密码窗口)。

现在我有一些试图访问互联网的Windows应用程序(如用于rss供稿的WebPI / Visual Studio 2008),但是因为它们无法弹出验证窗口,所以它们无法与互联网连接而出现错误:

  

(407)需要代理验证

。 这里的例外是VS2008,第一次总是无法在启动页面加载rss feed,但是当我点击链接时,它会显示身份验证窗口,之后一切正常。

  

我的问题是:我如何配置正常的Windows应用程序(通过app.config / app.manifest文件)访问web以显示身份验证窗口或提供默认凭据。

为了探索这个角度,我在VS2008上创建了一个控制台应用程序,它试图在谷歌上搜索一些内容并在控制台上显示结果。代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;

namespace WebAccess.Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Enter Serach Criteria:");
            string criteria = Console.ReadLine();
            string baseAddress = "http://www.google.com/search?q=";
            string output = "";

            try
            {

                // Create the web request   
                HttpWebRequest request = WebRequest.Create(baseAddress + criteria) as HttpWebRequest;

                // Get response   
                using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                {
                    // Get the response stream   
                    StreamReader reader = new StreamReader(response.GetResponseStream());

                    // Console application output   
                    output = reader.ReadToEnd();
                }

                Console.WriteLine("\nResponse : \n\n{0}", output);
            }
            catch (Exception ex)
            {
                Console.WriteLine("\nError : \n\n{0}", ex.ToString());
            }
        }
    }
}

运行时,它会出错

Enter Serach Criteria:
Lalit

Error :

System.Net.WebException: The remote server returned an error: (407) Proxy Authen
tication Required.
   at System.Net.HttpWebRequest.GetResponse()
   at WebAccess.Test.Program.Main(String[] args) in D:\LK\Docs\VS.NET\WebAccess.
Test\WebAccess.Test\Program.cs:line 26
Press any key to continue . . .

3 个答案:

答案 0 :(得分:7)

解决自己:

创建一个程序集以提供默认代理凭据

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;

namespace ProxyCredProvider
{
    public class DefProxy : IWebProxy
    {
        public ICredentials Credentials
        {
            get { return new NetworkCredential("xxxx", "xxxx"); }
            set { }
        }

        public Uri GetProxy(Uri destination)
        {
            return new Uri("http://xx.xx.xx.xx:8080/");
        }

        public bool IsBypassed(Uri host)
        {
            return false;
        } 

    }
}

将其安装到GAC。 并使用App.Config将上述模块附加到任何试图访问Web的exe。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.net>
    <defaultProxy enabled="true" useDefaultCredentials="false">
      <module type="ProxyCredProvider.DefProxy, ProxyCredProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5e3bf8f3a8a14cca" />
    </defaultProxy>
  </system.net>
</configuration>

答案 1 :(得分:0)

编辑:

有一些实用程序可以通过http://kakku.wordpress.com/2007/11/18/proxify-any-application-tsocks-and-proxychains-force-any-program-to-communicate-through-a-socks-https-proxy-or-use-cascading-proxies/中列出的代理隧道传输任何应用程序 - 查找“Windows替代品”链接..

答案 2 :(得分:0)

使用WebProxy对象,然后使用app.config获取proxyurl和用户名。对于密码,您可以在控制台中输入密码或者输入密码框。

WebProxy proxy = new WebProxy(proxyurl);
proxy.Credentials = new NetworkCredential(username, password, domain);
request.Proxy = proxy;

修改

抱歉,我误解了NTLMAPS

的内容