407 需要代理身份验证

Posted

技术标签:

【中文标题】407 需要代理身份验证【英文标题】:407 Proxy Authentication Required 【发布时间】:2009-10-06 09:35:36 【问题描述】:

我在一个网站上工作,我正在使用以下代码从外部 URL 检索 XML 数据

WebRequest req = WebRequest.Create("External server url");
req.Proxy = new System.Net.WebProxy("proxyUrl:8080", true);
req.Proxy.Credentials = CredentialCache.DefaultCredentials;
WebResponse resp = req.GetResponse();
StreamReader textReader = new StreamReader(resp.GetResponseStream());
XmlTextReader xmlReader = new XmlTextReader(textReader);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlReader);

此代码在我的开发 PC 上运行良好(带有 .Net 3.5 的 Windows XP)

但是当我将此代码部署到 IIS(在 Windows XP 和 Windows Server 2003 上)时,它给了我以下错误

“远程服务器返回错误:(407) 需要代理身份验证。”

有时它会给我

“远程服务器返回错误:(502) Bad Gateway。”

以下代码来自我的 web.config

<system.net>
    <defaultProxy>
      <proxy  usesystemdefault="False" proxyaddress ="http://172.16.12.12:8080" bypassonlocal ="True" />
    </defaultProxy>
  </system.net> 

请帮帮我?

[编辑] 即使我为开发 PC 运行该网站,但通过 IIS 它给我错误“远程服务器返回错误:(407) 需要代理身份验证。”

但是当我从 Microsoft Devlopment 服务器运行网站时,它运行良好

【问题讨论】:

【参考方案1】:

@Mohit Agarwal

非常感谢您建议添加“useDefaultCredentials="true"”,您是明星!

我一直试图让 Google Data API 示例 exe 的 .NET 库运行数周,但没有成功。添加您的建议解决了我的问题,我现在得到了一个连接,而不是 407 Proxy Authentication Required。

speadsheet.exe.config 内容需为:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.net>
    <defaultProxy useDefaultCredentials="true">
      <proxy usesystemdefault="true"/>
    </defaultProxy>
  </system.net>
</configuration>

就我而言,不像 Google 建议的那样:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <system.net>
  <defaultProxy>
   <proxy usesystemdefault="true"/>
  </defaultProxy>
 </system.net>
</configuration>

http://code.google.com/p/google-gdata/wiki/WebProxySetup

【讨论】:

【参考方案2】:

对于那些通过 Google 找到此内容的人可能会有所帮助,您实际上可以将其用于可能还没有自己的 AppName.exe.config 文件的 .NET 应用程序(或者如果有,您可以对其进行修改)。我们使用 NextGen EPM(医疗调度/计费),他们的信用卡处理系统一直卡在我们的代理服务器上,因为它无法通过凭据。我制作了一个包含上述 sn-p 的 EXEName.config 文件(在本例中为 NextGenEPM.exe.config):

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.net>
    <defaultProxy useDefaultCredentials="true">
      <proxy usesystemdefault="true"/>
    </defaultProxy>
  </system.net>
</configuration>

成功!这使我能够解决问题,而无需在我们的代理服务器中乱七八糟,该服务器被严格配置为需要身份验证,我们宁愿不妥协。

【讨论】:

【参考方案3】:

将web.config中的sn-p改为:

<system.net>
    <defaultProxy useDefaultCredentials="true">
      <proxy  usesystemdefault="False" proxyaddress ="http://172.16.12.12:8080" bypassonlocal ="True" />
    </defaultProxy>
</system.net>

【讨论】:

@Mohit,我已经在写 CredentialCache.DefaultCredentials;在源代码中,所以我认为它没有什么区别?【参考方案4】:

这可能是由于运行 IIS 的帐户没有通过身份验证代理的适当权限造成的。

当您在开发 PC 上运行它时,您是以登录身份运行它,我假设它具有通过代理的权限。在 IIS 中运行时,它没有像您一样运行,因此可能无法通过代理。

您可以授予 IIS 用户通过代理的权限(这不太可能在域环境中工作,因为 IIS 用户将是机器的本地用户),或者将您的应用程序配置为作为网络用户运行具有通过代理的权限。

这可以通过让 IIS 以域用户身份运行(我不推荐这种方法)或通过使用 web.config 将应用程序配置为以域用户身份运行来完成(有关更多信息,请参阅this 文章有关如何执行此操作的信息)。

【讨论】:

【参考方案5】:

app.configWeb.config 中的根&lt;configuration&gt; 元素下方:

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

【讨论】:

【参考方案6】:

如果你想指定代理详细信息,试试这个

<?xml version="1.0" encoding="utf-8" ?>
     <configuration>
          <system.net>
              <defaultProxy enabled="true" useDefaultCredentials="true">
                <proxy proxyaddress="http://<ProxyServer>:<port>" 
                       usesystemdefault="False" 
                       bypassonlocal="True" 
                       autoDetect="False" />
              </defaultProxy>
          </system.net>
</configuration>

干杯!

【讨论】:

【参考方案7】:

我们花了很长时间来解决这个问题,并更新了我们的 app.config 以使用上面答案中指定的默认凭据。 但是,它仍然没有工作! 在经历了很多痛苦之后,我们发现我们的 app.config 没有自动包含在我们的 click once 应用程序中。 一个简单的错误导致极端的头部破坏!!!

【讨论】:

以上是关于407 需要代理身份验证的主要内容,如果未能解决你的问题,请参考以下文章

C# 407 需要代理身份验证

HTTPS URL 的基本代理身份验证返回 HTTP/1.0 407 需要代理身份验证

在需要身份验证但不返回 407 的代理后面打开 http 连接

远程服务器返回错误:(407) 需要代理身份验证

Firebug 控制台错误 HTTP 407 需要代理身份验证

远程服务器返回错误:(407) 需要代理身份验证