远程服务器返回错误:(407) 需要代理身份验证
Posted
技术标签:
【中文标题】远程服务器返回错误:(407) 需要代理身份验证【英文标题】:The remote server returned an error: (407) Proxy Authentication Required 【发布时间】:2010-04-05 22:40:38 【问题描述】:我在调用 Web 服务时收到此错误:
“远程服务器返回错误:(407) 需要代理验证”。
我得到了大致的想法,我可以通过添加来让代码工作
myProxy.Credentials = NetworkCredential("user", "password", "domain");
或通过在代码中使用 DefaultCredentials。我的问题是,如果没有这个,对 Web 服务的调用在生产中工作。
似乎有一个涉及 Machine.config 的非代码解决方案,但它是什么?目前我无法访问生产盒的 machine.config 文件来查看它的外观。我尝试如下更新我的 machine.config,但我仍然收到 407 错误。
<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true">
<bypasslist>
<clear />
</bypasslist>
<proxy proxyaddress="myproxy:9000"
usesystemdefault="false"
bypassonlocal="true"
autoDetect="False" />
</defaultProxy>
</system.net>
【问题讨论】:
【参考方案1】:只需将其添加到配置中
<system.net>
<defaultProxy useDefaultCredentials="true" >
</defaultProxy>
</system.net>
【讨论】:
对于那些感兴趣的人,这正是我在 NetSuite 控制台/Web 服务应用程序中所需要的(似乎是)防火墙/代理约束。 最佳答案,让它成为配置细节而不是代码问题。 这在 Asp.net core 2.0 中仍然有效。我不得不添加一个 web.config 文件来处理这个问题。 Mine 是一个使用 AWS 开发工具包访问 S3 存储桶的 C# 控制台应用程序。将此添加到我的控制台应用程序中的 app.config 解决了问题【参考方案2】:在下面的代码中,我们不需要对凭据进行硬编码。
service.Proxy = WebRequest.DefaultWebProxy;
service.Credentials = System.Net.CredentialCache.DefaultCredentials; ;
service.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
【讨论】:
这对我来说很完美。如果您发现自己不想硬编码您的用户名和密码,请先尝试此选项。 感谢工作。但是,与 mehmet emin 所示的方法相比,这样做是否存在安全风险?添加网络凭据?还是使用网络凭据会授予更多权限,并带来安全风险? @Bryan “Mehmet Emin”代码的唯一问题是凭据的硬编码。在现实世界中,由于安全威胁,每个月都会更改密码,因此请在配置文件中进行配置。所以关注我的东西总是好的,或者我也喜欢 Seckin 的方式。 按预期工作。谢谢 @kucluk 你已经创建了服务代理的对象,所以在调用任何服务方法之前把这段代码。【参考方案3】:请咨询您的防火墙专家。 他们为 PROD 服务器打开防火墙,因此无需使用代理。
感谢您的提示帮助我解决了我的问题:
必须在两个位置设置凭据才能通过 407 错误:
HttpWebRequest webRequest = WebRequest.Create(uirTradeStream) as HttpWebRequest;
webRequest.Proxy = WebRequest.DefaultWebProxy;
webRequest.Credentials = new NetworkCredential("user", "password", "domain");
webRequest.Proxy.Credentials = new NetworkCredential("user", "password", "domain");
瞧!
【讨论】:
感谢@Werner-du-Toit。这正是我所需要的。 uirTradeStream ?【参考方案4】:可能prod里面的机器或者web.config有配置里面的设置;你可能不需要代理标签。
<system.net>
<defaultProxy useDefaultCredentials="true" >
<proxy usesystemdefault="False"
proxyaddress="http://<ProxyLocation>:<port>"
bypassonlocal="True"
autoDetect="False" />
</defaultProxy>
</system.net>
【讨论】:
谢谢,我试过了,但我仍然收到“(407)需要代理身份验证”错误。添加您列出的部分是否会为您停止错误?在我的本地机器上唯一可以确定的是在代码中设置 myProxy.Credentials 属性。【参考方案5】:HttpWebRequest webRequest = WebRequest.Create(uirTradeStream) as HttpWebRequest;
webRequest.Proxy = WebRequest.DefaultWebProxy;
webRequest.Credentials = new NetworkCredential("user", "password");
webRequest.Proxy.Credentials = new NetworkCredential("user", "password");
成功了。
【讨论】:
uirTradeStream ? 嗨使用此代码,但它在 webRequest.Proxy = WebRequest.DefaultWebProxy;并获得异常:(407)需要代理身份验证。请帮忙【参考方案6】:我遇到了类似的代理相关问题。就我而言,添加以下内容就足够了:
webRequest.Proxy.Credentials = new NetworkCredential("user", "password", "domain");
【讨论】:
【参考方案7】:想写这个答案,因为上面没有任何效果,您不想指定代理位置。
如果您使用的是httpClient
,请考虑一下。
HttpClientHandler handler = new HttpClientHandler();
IWebProxy proxy = WebRequest.GetSystemWebProxy();
proxy.Credentials = CredentialCache.DefaultCredentials;
handler.Proxy = proxy;
var client = new HttpClient(handler);
// your next steps...
如果您使用的是HttpWebRequest
:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri + _endpoint);
IWebProxy proxy = WebRequest.GetSystemWebProxy();
proxy.Credentials = CredentialCache.DefaultCredentials;
request.Proxy = proxy;
善意参考:https://medium.com/@siriphonnot/the-remote-server-returned-an-error-407-proxy-authentication-required-86ae489e401b
【讨论】:
以上是关于远程服务器返回错误:(407) 需要代理身份验证的主要内容,如果未能解决你的问题,请参考以下文章
SSIS 脚本转换错误远程服务器返回错误:(407) 需要代理身份验证
VS 2013远程服务器返回错误:(407)需要代理身份验证
在需要身份验证但不返回 407 的代理后面打开 http 连接