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

78

当我调用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>
7个回答

146

只需将此添加到配置文件中

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

对于那些感兴趣的人,这正是我在NetSuite控制台/ Web服务应用程序中所需要的,因为似乎存在防火墙/代理约束。 - dah97765
3
最佳答案是将其作为配置细节而不是代码问题解决。 - mccainz
1
这在Asp.net core 2.0中仍然有效。我不得不添加一个web.config文件来纯粹处理这个问题。 - jmdon
1
我的是一个使用AWS SDK访问S3存储桶的C#控制台应用程序。将这个添加到我的控制台应用程序的app.config中解决了这个问题。 - Ziggler

55

在以下代码中,我们不需要硬编码凭证。

service.Proxy = WebRequest.DefaultWebProxy;
service.Credentials = System.Net.CredentialCache.DefaultCredentials; ;
service.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;

这对我来说完美地运作了。如果你不想硬编码你的用户名和密码,首先尝试这个选项。 - sapbucket
谢谢,那个方法可行。但是,这种方式与Mehmet Emin展示的方法相比是否存在安全风险?使用网络凭据会给予更多权限,同时也会引入安全风险吗? - Bryan
1
@Bryan,“Mehmet Emin”代码的唯一问题是凭据的硬编码。在现实世界中,由于安全威胁,密码每个月都会更改,因此要么将它们配置在配置文件中,这样就始终可以使用它们。所以最好遵循我的方式,或者我也喜欢Seckin的方式。 - Romil Kumar Jain
正常工作。谢谢。 - Anshuman Jasrotia
1
@kucluk,您已经创建了服务代理对象,因此在调用服务的任何方法之前,请放置此代码。 - Romil Kumar Jain

20

请向您的防火墙专家咨询。 他们会为生产服务器打开防火墙,因此无需使用代理。

感谢您的提示,它帮助我解决了我的问题:

必须在两个位置设置凭据才能解决 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");

然后,就完成了!


uirTradeStream? - Himanshu sharma

7

很可能生产环境中的机器或web.config文件已经在配置中设置了,你可能不需要代理标签。

<system.net>
    <defaultProxy useDefaultCredentials="true" >
        <proxy usesystemdefault="False"
               proxyaddress="http://<ProxyLocation>:<port>"
               bypassonlocal="True"
               autoDetect="False" />
    </defaultProxy>
</system.net>

谢谢,我尝试了这个方法,但仍然出现“(407) Proxy Authentication Required”错误。您列出的部分是否可以解决这个问题?在我的本地环境中,唯一有效的方法是在代码中设置myProxy.Credentials属性。 - chris

4
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? - Himanshu sharma
嗨,我使用这段代码,但在 webRequest.Proxy = WebRequest.DefaultWebProxy; 处出现问题,并且收到了异常:(407) Proxy Authentication Required。请帮忙解决。 - user1196392

3

如果以上方法都不起作用,或者您不想指定代理位置,请考虑以下方法。

如果您正在使用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 代理身份验证要求。

2

我有一个类似的代理相关问题。在我的情况下,只需要添加:

webRequest.Proxy.Credentials = new NetworkCredential("user", "password", "domain");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接