调用 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>
只需将其添加到配置中
<system.net>
<defaultProxy useDefaultCredentials="true" >
</defaultProxy>
</system.net>
在下面的代码中,我们不需要对凭据进行硬编码。
service.Proxy = WebRequest.DefaultWebProxy;
service.Credentials = System.Net.CredentialCache.DefaultCredentials; ;
service.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
请咨询您的防火墙专家。他们为 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");
瞧!
可能 prod 中的 machine 或 web.config 有配置中的设置;您可能不需要代理标签。
<system.net>
<defaultProxy useDefaultCredentials="true" >
<proxy usesystemdefault="False"
proxyaddress="http://<ProxyLocation>:<port>"
bypassonlocal="True"
autoDetect="False" />
</defaultProxy>
</system.net>
HttpWebRequest webRequest = WebRequest.Create(uirTradeStream) as HttpWebRequest;
webRequest.Proxy = WebRequest.DefaultWebProxy;
webRequest.Credentials = new NetworkCredential("user", "password");
webRequest.Proxy.Credentials = new NetworkCredential("user", "password");
这是成功的。
我有一个类似的代理相关问题。就我而言,添加以下内容就足够了:
webRequest.Proxy.Credentials = new NetworkCredential("user", "password", "domain");
考虑写这个答案,因为上面没有任何效果,您不想指定代理位置。
如果您使用的是 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;