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.config
或Web.config
中的根<configuration>
元素下方:
<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 需要代理身份验证的主要内容,如果未能解决你的问题,请参考以下文章
HTTPS URL 的基本代理身份验证返回 HTTP/1.0 407 需要代理身份验证
在需要身份验证但不返回 407 的代理后面打开 http 连接