【问题标题】:Using a proxy per console application每个控制台应用程序使用一个代理
【发布时间】:2012-01-14 14:06:40
【问题描述】:

我有一个运行一些网络爬取控制台应用程序的虚拟机。我想知道您如何为每个控制台应用程序使用不同的代理。我发现的大多数代理 C# 内容都会更改注册表,但这会更改所有控制台应用程序,而不仅仅是一个。

任何人都有一个示例,说明如何在不影响所有其他控制台应用程序的情况下为特定控制台应用程序使用特定代理?

寻找源代码解决方案

【问题讨论】:

  • 您是否正在寻找一种方法来更改其中一个控制台应用程序的源代码,或者您是否正在寻找一种外部方法来控制您没有源代码的程序使用的代理?

标签: c# proxy console-application


【解决方案1】:

假设您的控制台应用程序使用一种用于下载网页的内置方法(WebClient、HttpWebRequest 等),它们都有一个Proxy Property,应该可以满足您的需求。它们几乎都以相同的方式工作,因此这是 MSDN 文档为 HttpWebRequest.Proxy 提供的示例:

// Create a new request to the mentioned URL.               
HttpWebRequest myWebRequest=(HttpWebRequest)WebRequest.Create("http://www.microsoft.com");

// Obtain the 'Proxy' of the  Default browser.  
IWebProxy proxy = myWebRequest.Proxy;
// Print the Proxy Url to the console.
if (proxy != null)
{
    Console.WriteLine("Proxy: {0}", proxy.GetProxy(myWebRequest.RequestUri));
} 
else
{
    Console.WriteLine("Proxy is null; no proxy will be used");
}

WebProxy myProxy=new WebProxy();

Console.WriteLine("\nPlease enter the new Proxy Address that is to be set:");
Console.WriteLine("(Example:http://myproxy.example.com:port)");
string proxyAddress;

try
{
    proxyAddress =Console.ReadLine();
    if(proxyAddress.Length>0)
    {
    Console.WriteLine("\nPlease enter the Credentials (may not be needed)");
    Console.WriteLine("Username:");
    string username;
    username =Console.ReadLine();
    Console.WriteLine("\nPassword:");
    string password;
    password =Console.ReadLine();                   
    // Create a new Uri object.
    Uri newUri=new Uri(proxyAddress);
    // Associate the newUri object to 'myProxy' object so that new myProxy settings can be set.
    myProxy.Address=newUri;
    // Create a NetworkCredential object and associate it with the 
    // Proxy property of request object.
    myProxy.Credentials=new NetworkCredential(username,password);
    myWebRequest.Proxy=myProxy;
    }
    Console.WriteLine("\nThe Address of the  new Proxy settings are {0}",myProxy.Address);
    HttpWebResponse myWebResponse=(HttpWebResponse)myWebRequest.GetResponse();

【讨论】:

    【解决方案2】:

    您可以为每个控制台应用程序创建自己的代理身份验证类。

    namespace YourProxyNameSpace
    {
      public class YourProxyClass: IWebProxy
      {
            public Uri GetProxy(Uri destination)
            {
                string proxy = ConfigurationManager.AppSettings["proxyaddress"];
                return new Uri(proxy);
            }
    
            public bool IsBypassed(Uri host)
            {
                return false;
            }
    
            public ICredentials Credentials
            {
                get
                {
                    string username = ConfigurationManager.AppSettings["username"];
                    string password = ConfigurationManager.AppSettings["password"];
                    return new NetworkCredential(username, password);
                }
                set { }
            }
        }
    }
    

    在配置文件(app.config)中添加以下节点

    <system.net>    
    <defaultProxy>
    <module type="YourProxyNameSpace.YourProxyClass, YourProxyNameSpace"/>    
    </defaultProxy>
    </system.net>
    
    
     <add key="proxyaddress" value="http://proxyAddress:PORT"/>
        <add key="username" value="*****"/>
        <add key="password" value="*****"/>
    

    希望它可以帮助某人。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多