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


74

调用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>

Answers:


139

只需将其添加到配置

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

对于那些感兴趣的人来说,这恰恰是我在NetSuite控制台/ Web服务应用程序中(似乎是防火墙/代理约束)所需要的。
dah97765,2016年

3
最佳答案,使其成为配置详细信息,而不是代码问题。
mccainz

1
在Asp.net core 2.0中仍然可以使用。我必须纯粹添加一个web.config文件来处理此问题。
jmdon

54

在以下代码中,我们不需要对凭据进行硬编码。

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

这对我来说很完美。如果发现自己不想对用户名和密码进行硬编码,请首先尝试使用此选项。
sapbucket 2013年

谢谢你的工作。但是,与mehmet emin所示的方法相比,以这种方式进行操作是否存在安全风险?加上网络凭证?还是使用网络凭据会赋予更多权限并带来安全风险?
布赖恩

1
@Bryan“ Mehmet Emin”代码的唯一问题是凭证的硬编码。在现实世界中,由于安全威胁,每月都会更改密码,因此可以在配置文件中对其进行配置。所以跟随我的东西总是很好,或者我也喜欢Seckin的方式。
Romil Kumar Jain 2015年

按预期工作。谢谢
Anshuman Jasrotia

1
@kucluk您已经创建了服务代理的对象,因此请在调用任何服务方法之前放置此代码。
罗米尔·库马尔·贾因

19

请与您的防火墙专家联系。他们为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。这正是我所需要的。
inquisitive_one 2012年

uirTradeStream?
Himanshu sharma

6

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属性。
克里斯,2010年

3
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)要求代理身份验证。请帮助
user1196392 '18

2

我有一个类似的代理相关问题。就我而言,添加以下内容就足够了:

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

0

想到将这个答案写成上面没有做的任何事情,并且您不想指定代理位置。

如果您正在使用,请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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.