ChatGPT解决这个技术问题 Extra ChatGPT

C# 通过代理连接

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


C
CraigTP

这可以通过编程方式、在您的代码中或以声明方式在 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 - 没有特别的原因。这只是一个疏忽,因为在该示例中,我使用了构造函数,该构造函数采用 URL(作为字符串)和布尔值来确定是否绕过本地地址。如果您需要特定的端口号,最好使用允许 URL(作为字符串)和端口号(作为 Int32)的重载构造函数,然后立即将 BypassProxyOnLocal 属性设置为 True(如果需要)然后。
@Skuta - 我已经编辑了我的帖子以澄清这一点,并确保程序化和声明性示例实际上在做同样的事情!
O
Oded

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

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

网络配置:

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

使用 this article 中描述的 WebProxy 类。

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

网络配置:

<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();

R
Robert Christie

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

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

更多详细信息可在 MSDN article on System.Net 中找到


注意: 部分位于 部分或 exe.config 文件中。这让代理的东西在我制作的一个简单的控制台应用程序中工作。
f
fretje

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

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);
    }
}

WebProxy.GetDefaultProxy 自 Framework 4.5 起已过时,此方法返回 null。使用前最好三思而后行CredentialCache.DefaultNetworkCredentials。如果您在 CredentialCache 中放了一些东西并且您的代理需要这样的凭据,那么它应该可以工作。否则将无济于事。
M
Milo

这个单线对我有用:

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

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

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


“CredentialCache.DefaultNetWorkCredentials 是 Internet Explorer 中设置的代理设置”。现在还是这样吗?我在 Internet 选项 > 连接 > LAN 设置中找不到任何地方来写用户名和密码。
来自文档:“对于客户端应用程序,这些通常是运行应用程序的用户的 Windows 凭据(用户名、密码和域)。”
这个答案可能有点陈旧,但我很确定 2015 年的 Windows 确实如此
J
JCH2k

Fool 的代码对我来说非常有效,但是在 .NET 4.0 中,不要忘记检查 Proxy 是否为 NULL,这意味着没有配置代理(在公司环境之外)

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

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

F
Foole

这段代码对我有用:

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

E
Elijah Glover

自动代理检测是系统识别 Web 代理服务器并用于代表客户端发送请求的过程。此功能也称为 Web 代理自动发现 (WPAD)。启用自动代理检测后,系统会尝试查找负责返回可用于请求的代理集的代理配置脚本。

http://msdn.microsoft.com/en-us/library/fze2ytx2.aspx


这如何回答这个问题? OP 如何使用这些信息?
J
JD-V
            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);

最好写下您的解决方案的解释,而不仅仅是发布代码。你能编辑一些对读者有帮助的文本吗?
M
Mukus

我将用一个例子来补充上面的答案。

我在尝试通过 Web Platform Installer 安装软件包时遇到了代理问题

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

我尝试了 this IIS forum 中的编辑建议,即

<?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 平台安装程序注册才能使用它。