63

以下代码适用于我:

var webProxy = WebProxy.GetDefaultProxy();
webProxy.UseDefaultCredentials = true;
WebRequest.DefaultWebProxy = webProxy;

不幸的是,WebProxy.GetDefaultProxy()已弃用。我还应该做什么?

(在我的部署中不允许使用 app.config 设置 defaultProxy 设置)

4

10 回答 10

102

对于那些与 Brian Genisio 不同的是,他们能够设置应用程序配置文件的内容:- 不要在代码中做任何事情。而是将其添加到您的 app.config/web.config。

<system.net>
  <defaultProxy useDefaultCredentials="true" />
</system.net>

真正地,真正地使用默认凭据的默认值应该是“true”;我看到这个问题让很多人感到困惑——开发人员、用户、IT 人员。

有关更多信息,请参见此处:- http://sticklebackplastic.com/post/2007/01/26/Poxy-proxies.aspx

更新:我为微软创建了这个问题/想法,将 useDefaultCredentials 的默认值从 false 更改为 true,这样整个问题就消失了,.NET 应用程序“正常工作”;如果您同意,请投票:http:
//visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2397357-fix-it-so-that-net-apps-can-access-http-thru-授权

于 2011-11-18T10:20:20.040 回答
57

从 .NET 2.0 开始,您不需要这样做。如果您没有在 Web 请求上显式设置 Proxy 属性,它将使用静态 WebRequest.DefaultWebProxy 的值。如果要更改所有后续 WebRequest 使用的代理,可以设置此静态 DefaultWebProxy 属性。

WebRequest.DefaultWebProxy 的默认行为是使用与 Internet Explorer 相同的基础设置。

如果您想对当前用户使用不同的代理设置,那么您需要编写代码

WebRequest webRequest = WebRequest.Create("http://stackoverflow.com/");
webRequest.Proxy = new WebProxy("http://proxyserver:80/",true);

或者

WebRequest.DefaultWebProxy = new WebProxy("http://proxyserver:80/",true);

您还应该记住代理的对象模型包括代理可以根据目标主机名而有所不同的概念。在调试和检查 webRequest.Proxy 的属性时,这会使事情变得有点混乱。称呼

webRequest.Proxy.GetProxy(new Uri("http://google.com.au"))查看将使用的代理服务器的实际详细信息。

关于是否可以设置webRequest.ProxyWebRequest.DefaultWebProxy = null阻止使用任何代理似乎存在一些争论。这对我来说似乎工作正常,但您可以将其设置为new DefaultProxy()不带参数以获得所需的行为。要检查的另一件事是,如果您的应用程序配置文件中存在代理元素,.NET Framework 将不会使用 Internet Explorer 中的代理设置。

MSDN 杂志文章通过 .NET 中的自动配置减轻用户的负担提供了有关幕后发生的事情的更多详细信息。

于 2008-11-19T01:10:10.133 回答
18

这将强制DefaultWebProxy使用默认凭据,效果与通过UseDefaultCredentials = true.

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

因此,所有新创建的WebRequest实例都将使用已配置为使用代理的默认凭据的默认代理。

于 2013-09-30T05:02:53.447 回答
5

您可以使用反射将UseDefaultCredentials-Property from Code 设置为“true”

System.Reflection.PropertyInfo pInfo = System.Net.WebRequest.DefaultWebProxy.GetType().GetProperty("WebProxy", 
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

((System.Net.WebProxy)pInfo.GetValue(System.Net.WebRequest.DefaultWebProxy, null)).UseDefaultCredentials = true;
于 2012-07-11T09:44:44.127 回答
3

似乎在一些较新的应用程序中,配置是不同的,正如我在这个问题上看到的那样,使用 HttpClient 类时如何对代理进行身份验证?

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

还记录在https://msdn.microsoft.com/en-us/library/dkwyc043.aspx

于 2017-01-25T09:44:07.107 回答
2

这个线程很旧,但我最近偶然发现了 defaultProxy 问题,也许它可以帮助其他人。

我按照安德鲁的建议使用了配置设置。部署它时,我的客户收到一条错误消息,说没有足够的权限来设置配置“defaultProxy”。

不知道为什么我无权设置此配置以及如何处理它,我只是将其删除,它仍然有效。所以似乎在 VS2013 中这个问题是固定的。

当我们这样做时:

    WebRequest.DefaultWebProxy.Credentials = new NetworkCredential("ProxyUsername", "ProxyPassword");

将默认代理与您的凭据一起使用。如果您想强制不使用代理,只需将 DefaultWebProxy 设置为 null(尽管我不知道是否需要)。

于 2013-12-11T10:24:14.107 回答
1

在我的部署中,我不能使用 app.config 来嵌入 Andrew Webb 建议的内容。
所以我这样做:

    IWebProxy proxy = WebRequest.GetSystemWebProxy();
    proxy.Credentials = CredentialCache.DefaultCredentials;

    WebClient wc = new WebClient();
    wc.UseDefaultCredentials = true;
    wc.Proxy = proxy;

以防万一您想检查我的 IE 设置:

在此处输入图像描述

于 2013-04-17T18:44:46.803 回答
0

这是新建议的方法。

WebRequest.GetSystemWebProxy();
于 2011-01-17T22:30:52.277 回答
0

这里的大多数答案都使用了已弃用的 API。在 Powershell 5/6/7 中执行此操作的新方法是:

[System.Net.WebRequest]::GetSystemWebProxy().Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials;

您可以将上述行放在您的 Powershell 5 和 Powershell 6/7 $Profile.AllUsersAllHosts 中。

于 2020-11-12T06:33:33.493 回答
-3

在某些系统中需要将代理属性设置为空:

Net.WebRequest.DefaultWebProxy.Credentials = System.Net.CredentialCache.DefaultCredentials Dim request As WebRequest = WebRequest.Create(sRemoteFileURL) request.Proxy = Nothing

这是一个错误。

于 2014-11-11T19:42:14.050 回答