C#通过代理连接


92

我在办公室工作,该办公室要求所有连接都必须通过特定的http代理进行。我需要编写一个简单的应用程序来从Web服务器查询一些值-如果没有代理,这很容易。如何使C#应用程序可感知代理?如何通过代理建立任何形式的连接?

Answers:


103

这很容易以编程方式在您的代码中或以声明性方式在web.config或app.config中实现。

您可以通过编程方式创建代理,如下所示:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("[ultimate destination of your request]");
WebProxy myproxy = new WebProxy("[your proxy address]", [your proxy port number]);
myproxy.BypassProxyOnLocal = false;
request.Proxy = myproxy;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse) request.GetResponse();

您基本上是将WebProxy对象分配给request对象的proxy属性。这request则将会使用proxy您定义。

要以声明的方式实现相同的目的,可以执行以下操作:

<system.net>
  <defaultProxy>
    <proxy
      proxyaddress="http://[your proxy address and port number]"
      bypassonlocal="false"
    />
  </defaultProxy>
</system.net>

在您的web.config或app.config中。这将设置所有HTTP请求都将使用的默认代理。根据实际需要实现的内容,您可能需要也可能不需要defaultProxy / proxy元素的某些其他属性,因此请参考文档。


在程序示例中,您没有设置端口,为什么?
Skuta

@Skuta-没有特别的原因。这只是一个疏忽,因为在该示例中,我正在使用构造函数,该构造函数采用URL(作为字符串)和布尔值来确定是否绕过了本地地址。如果需要特定的端口号,最好使用允许URL(作为字符串)和端口号(作为Int32)的重载构造函数,然后BypassProxyOnLocal立即将属性设置为True(如果需要)。
CraigTP

2
@Skuta-我已经编辑了我的帖子,以澄清这一点,并确保编程和声明性示例实际上在做同样的事情!
CraigTP

23

如果您使用WebClient,它具有可以使用的Proxy属性。

正如其他人提到的,有几种方法可以自动执行代理设置检测/使用

Web.Config:

<system.net>
   <defaultProxy enabled="true" useDefaultCredentials="true">
     <proxy usesystemdefault="true" bypassonlocal="true" />
   </defaultProxy>
</system.net>

本文所述使用WebProxy类。


您也可以直接配置代理设置(配置或代码),然后您的应用将使用这些设置。

Web.Config:

<system.net>
  <defaultProxy>
    <proxy
      proxyaddress="http://[proxy address]:[proxy port]"
      bypassonlocal="false"
    />
  </defaultProxy>
</system.net>

码:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("url");
WebProxy myproxy = new WebProxy("[proxy address]:[proxy port]", false);
request.Proxy = myproxy;
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse) request.GetResponse();

7

试试这个代码。在发出任何http请求之前先调用它。该代码将使用Internet Explorer设置中的代理-但我使用一件事是proxy.Credentials = ....因为代理服务器是经过NTLM身份验证的Internet Acceleration Server。给它发丝。

static void setProxy()
{
    WebProxy proxy = (WebProxy)WebProxy.GetDefaultProxy();
    if(proxy.Address != null)
    {
        proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
        WebRequest.DefaultWebProxy = new System.Net.WebProxy(proxy.Address, proxy.BypassProxyOnLocal, proxy.BypassList, proxy.Credentials);
    }
}

3
WebProxy.GetDefaultProxy从Framework 4.5开始已过时,并且此方法返回null。使用前最好考虑一下CredentialCache.DefaultNetworkCredentials。如果您已将某些内容放入CredentialCache中,并且您的代理需要此类凭据,则它应该可以工作。否则将无济于事。
cassandrad

6

如果您希望应用程序使用系统默认代理,请将其添加到Application.exe.config(其中application.exe是应用程序的名称):

<system.net>
   <defaultProxy enabled="true" useDefaultCredentials="true">
   <proxy usesystemdefault="true" bypassonlocal="true" />
   </defaultProxy>
</system.net>

在System.Net上的MSDN文章中可以找到更多详细信息


注意:<system.net>部分位于<configuration>部分或exe.config文件中。这使代理工作在我准备的一个简单的控制台应用程序中。
约翰·代尔

5

这种单线适用于我:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

CredentialCache.DefaultNetWorkCredentials 是在Internet Explorer中设置的代理设置。

WebRequest.DefaultWebProxy.Credentials 用于应用程序中的所有Internet连接。


1
“ CredentialCache.DefaultNetWorkCredentials是Internet Explorer中设置的代理设置”。还是这样吗?在“ Internet选项”>“连接”>“ LAN设置”中找不到要写入用户名和密码的位置。
马特

来自文档:“对于客户端应用程序,这些通常是运行该应用程序的用户的Windows凭据(用户名,密码和域)。”
Coert Grobbelaar

这个答案的年龄可能有点差,但是我很确定这对于2015 Windows是正确的
Coert Grobbelaar

4

Foole的代码非常适合我,但是在.NET 4.0中,请不要忘记检查Proxy是否为NULL,这意味着未配置任何代理(公司环境外部)

这是解决我们公司代理问题的代码

WebClient web = new WebClient();
if (web.Proxy != null)
    web.Proxy.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;

3

这段代码对我有用:

WebClient wc = new WebClient();
wc.Proxy.Credentials = CredentialCache.DefaultCredentials;


0
            var getHtmlWeb = new HtmlWeb() { AutoDetectEncoding = false, OverrideEncoding = Encoding.GetEncoding("iso-8859-2") };

            WebProxy myproxy = new WebProxy("127.0.0.1:8888", false);
            NetworkCredential cred = (NetworkCredential)CredentialCache.DefaultCredentials;
            var document = getHtmlWeb.Load("URL", "GET", myproxy, cred);

5
最好写一个解决方案的说明,而不仅仅是发布代码。您可以编辑一些对读者有帮助的文字吗?
Brian Tompsett-汤莱恩2015年

0

我将使用一个示例来添加上述答案。

尝试通过Web平台安装程序安装软件包时遇到代理问题

这也使用了一个配置文件,即WebPlatformInstaller.exe.config

我试过在编辑建议这个IIS论坛这是

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
  <system.net>    
     <defaultProxy enabled="True" useDefaultCredentials="True"/>      
   </system.net>
</configuration>

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
   <system.net>    
     <defaultProxy>      
          <proxy 
               proxyaddress="http://yourproxy.company.com:80" 
               usesystemdefault="True"
               autoDetect="False" />    
     </defaultProxy>  
   </system.net>
</configuration>

这些都不起作用。

对我有用的是-

<system.net>    
    <defaultProxy enabled="true" useDefaultCredentials="false">
      <module type="WebPI.Net.AuthenticatedProxy, WebPI.Net, Version=1.0.0.0, Culture=neutral, PublicKeyToken=79a8d77199cbf3bc" />
    </defaultProxy>  
 </system.net>

该模块需要在Web Platform Installer中注册才能使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.