如何使WebClient(webservice客户端)自动使用默认代理服务器?

12

我正在从一个WinForms应用程序调用一个Web服务。当没有使用代理服务器时,一切正常,但当使用代理时,应用程序会崩溃,因为它收到的是一个HTML错误页面,而不是它期望的SOAP请求的XML响应,该页面显示“需要身份验证”。

看起来可以这样手动设置代理:

WebClient client = new WebClient();
WebProxy wp = new WebProxy("proxy server url here");
client.Proxy = wp;

然而,在某种程度上,似乎无论如何都能够看到代理服务器(proxy server),因为产生的错误实际上来自代理服务器。只是它似乎无法从用户计算机中获取Windows身份验证登录凭据。我该如何强制它执行此操作?

如果我在自己的机器上使用Fiddler进行模拟(并启用“要求代理身份验证”选项),会出现一个对话框,要求输入登录凭据,但是在我的客户机上(使用真实的硬件代理-McAfee Web Gateway)却似乎没有这种情况。

我该如何处理?我需要为用户提供一个对话框手动配置服务器,还是有一种设置可以告诉WebClient使用Windows默认代理和用户自己的登录凭据?

更新

似乎可以使用以下代码获取代理服务器,但这并不会在所有情况下弹出身份验证对话框(在某些PC上工作,但在其他PC上不起作用):

IWebProxy defaultProxy = WebRequest.DefaultWebProxy;
if (defaultProxy != null)
{
    defaultProxy.Credentials = CredentialCache.DefaultCredentials;
    client.Proxy = defaultProxy;
}

如果上面的代码正确,我不明白为什么有些用户不会被提示输入他们的凭据。我是否需要编写自己的代码来收集用户凭据并将其提供给 WebRequest 对象?


1
不确定这是否相关,因为我的应用程序已经作为本地用户运行了,我认为是吧? - NickG
可能相关:https://dev59.com/sXRA5IYBdhLWcg3wvgkb - Joshua Drake
@GONeale 不,我不会接受他的答案,因为它对解决我的问题没有任何影响。 - NickG
好的,那是一个不接受它的好理由;这很奇怪,为什么它对你不起作用?我一添加它,它就开始继承IE代理设置。 - GONeale
因为它依赖于用户凭据在缓存中存在,而我在测试的任何系统上都从未出现过这种情况——即使我刚刚登录。我不知道凭证何时在缓存中,但我刚刚发现它们并没有,所以这个解决方案对我没有帮助。 - NickG
显示剩余5条评论
3个回答

19
尝试添加。
  <system.net>
    <defaultProxy useDefaultCredentials="true" />
  </system.net>

添加到您的 app.config 文件中


2
在 web.config 文件中也有帮助。应该放置在 <configuration> 标签内。 - Stanislav

5
using (WebClient webClient = new WebClient())
{

    webClient.UseDefaultCredentials = true;
    webClient.Proxy = WebRequest.GetSystemWebProxy();
}

这应该可以工作


2
对我来说不起作用,我仍然收到“407代理身份验证要求”。 - Colonel Panic
请参阅 https://dev59.com/IXVC5IYBdhLWcg3wbQfA。 - Colonel Panic

0

首先尝试使用这个:

WebProxy proxy = (WebProxy) WebRequest.DefaultWebProxy;
if (proxy.Address.AbsoluteUri != string.Empty)
{
    Console.WriteLine("Proxy URL: " + proxy.Address.AbsoluteUri);
    client.Proxy = proxy;
}

如果这不起作用,请尝试:

WebProxy proxy = WebProxy.GetDefaultProxy()
client.Proxy = proxy;

2
WebPRoxy.GetDefaultProxy已经过时。 - Robert Bratton

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