【问题标题】:How should I set the default proxy to use default credentials?我应该如何设置默认代理以使用默认凭据?
【发布时间】:2008-11-18 20:00:53
【问题描述】:

以下代码适用于我:

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

很遗憾,WebProxy.GetDefaultProxy() 已被弃用。我还应该做什么?

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

【问题讨论】:

  • 看看我们有两种在 .net 应用程序中使用代理的方法。第一个是在 web.config 中使用代理设置。第二个在代码中使用 webproxy 类。在 web.config 中,您不能使用网络凭据(用户和密码)。但在代码中,您可以使用凭据。您可以在此处了解有关代理的更多信息 - goo.gl/bLDAHp

标签: .net proxy


【解决方案1】:

对于那些与 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-auth

【讨论】:

  • 不确定您是否看到我的原始帖子,但我曾声明在我的部署中不允许使用 app.config... 否则我会这样做。
  • 我认识 Brian,但回答您的问题“我应该如何设置默认代理以使用默认凭据?”,我认为我的回答会帮助很多人,因为大多数人都可以设置他们的配置文件的内容。
  • 基本上,微软默认的“false”设置是错误的,并且已经并继续造成大量的混乱。没有多少人知道如何解决这个问题,无论是在代码中还是在配置中——我从第一手经验中知道这一点。如果您同意,请投票支持我的“用户声音”建议,以便在未来的 .NET 版本中更改此设置;见上面的链接。谢谢。
  • 新手问题:此设置如何影响那些不在任何代理后面的人?
  • sjlewis,此设置不会影响那些不在任何代理后面的人。仅当 .NET 代码需要通过网络(通常是 Web)进行访问,但遇到需要凭据的代理服务器时,才会咨询该设置。如果您要发布的桌面应用程序可能会或可能不会在身份验证代理后面运行,则最好发布包含此设置的 app.config 文件,以避免潜在问题。如果微软更改了默认设置,那将没有必要。 :)
【解决方案2】:

从 .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() 而不使用任何参数来获得所需的行为。要检查的另一件事是,如果您的应用程序配置文件中存在 proxy element,.NET Framework 将使用 Internet Explorer 中的代理设置。

MSDN 杂志文章 Take the Burden Off Users with Automatic Configuration in .NET 提供了有关幕后发生的事情的更多详细信息。

【讨论】:

  • 我同意我觉得我不需要这样做,但我确实这样做了。如果我不这样做,我会在默认代理身份验证上收到 407 失败。如果我这样做,那么我的客户可以通过代理。
  • 您的 .config 文件中是否有 元素?如果是这样,请摆脱它并重试。
  • 配置文件中的设置是唯一让它工作的东西......但我只是在玩弄它。我根本无法在我的环境中访问 .config,所以这不是我的选择。
  • WebRequest.Create 将使用默认代理生成请求,但默认情况下,此代理会将 UseDefaultCredentials 设置为 false。要使用默认凭据,请将其设置为 true。
【解决方案3】:

这将强制DefaultWebProxy 使用默认凭据,与通过UseDefaultCredentials = true 完成的效果类似。

WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultNetworkCredentials;

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

【讨论】:

  • 这是帮助我解决问题的唯一答案。它基本上做了公认的答案,但没有 app.config。在我们的 winrt windows8.1 应用程序中,我们无法在部署中添加 app.config,因为某种原因它会破坏应用程序。
【解决方案4】:

您可以使用反射将代码中的UseDefaultCredentials-Property 设置为“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;

【讨论】:

    【解决方案5】:

    似乎在一些较新的应用程序中配置是不同的,正如我在这个问题上看到的那样How to authenticate against a proxy when using the HttpClient class?

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

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

    【讨论】:

    • 当我将此代码放入我的 App.Config 时,我在 KERNELBASE.dll 中遇到了崩溃,并且没有错误消息
    【解决方案6】:

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

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

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

    当我们这样做的时候:

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

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

    【讨论】:

      【解决方案7】:

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

          IWebProxy proxy = WebRequest.GetSystemWebProxy();
          proxy.Credentials = CredentialCache.DefaultCredentials;
      
          WebClient wc = new WebClient();
          wc.UseDefaultCredentials = true;
          wc.Proxy = proxy;
      

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

      【讨论】:

        【解决方案8】:

        这是建议的新方法。

        WebRequest.GetSystemWebProxy();
        

        【讨论】:

        • 注意澄清“新”是什么,它不是像其他答案中的东西那样在 v2 中出现吗?您能否详细说明这个答案与其他答案有何不同和/或更好?
        • Akshinthala:问题表明他使用的方法已弃用 WebProxy.GetDefaultProxy() 并且询问他应该使用什么。如果您查看该方法msdn.microsoft.com/en-us/library/… 的文档,您将看到它列出了现在应该使用的更新方法。应用程序应使用 WebRequest.DefaultWebProxy 属性和 WebRequest.GetSystemWebProxy 方法,而不是 GetDefaultProxy 方法。
        【解决方案9】:

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

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

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

        【讨论】:

          【解决方案10】:

          是否需要在某些系统中将 Proxy 属性设置为 null:

          Net.WebRequest.DefaultWebProxy.Credentials = System.Net.CredentialCache.DefaultCredentials 昏暗请求 As WebRequest = WebRequest.Create(sRemoteFileURL) request.Proxy = 无

          这是一个错误。

          【讨论】:

            猜你喜欢
            • 2010-10-12
            • 1970-01-01
            • 2021-12-22
            • 1970-01-01
            • 2014-05-14
            • 2022-01-09
            • 2020-03-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多