我有一个基于.NET 4构建的控制台应用程序,它使用HttpClient库(通过NuGet获取)通过Internet从公共API检索数据.控制台应用程序位于代理后面.它所在的Windows机器在Internet Explorer中具有正确的代理设置.当控制台应用程序尝试访问外部世界时,它将获得407状态 - "需要代理身份验证".
我还没有写任何特定的代码来处理代理.我假设从407错误,应用程序指向代理没有问题,但代理不验证请求.
我的问题是,是否可以设置HttpClient使用登录用户的凭据来验证代理?如果是这样,怎么样?
var client = new HttpClient(webRequestHandler);
client.PostAsync(RequestUri, MyContent);
Run Code Online (Sandbox Code Playgroud) 我的用例是这样的,我想呼叫一个web服务,如果我在需要身份验证的代理服务器后面,我想只使用默认凭据...
WebRequest.DefaultWebProxy.Credentials = CredentialCache.DefaultCredentials;
Run Code Online (Sandbox Code Playgroud)
否则我只是简单地拨打电话,确定是否需要事先验证是非常好的,而不是在我尝试拨打电话后处理异常.
想法?
我无法使用.Net WebRequest在IE选项中获得代理自动配置(PAC)以按预期工作.
根据这篇文章:
代理检测在.NET中使用自动配置减轻用户负担
默认情况下,系统代理应设置为每个WebRequest.
这就是proxy.js pac文件的样子:
function FindProxyForURL(url, host)
{
return "PROXY ProxyServerName:3118; DIRECT;";
}
Run Code Online (Sandbox Code Playgroud)
我还看了一下这篇文章:我应该如何设置默认代理以使用默认凭据?
这建议在app.config中添加:
<system.net>
<defaultProxy useDefaultCredentials="true" />
</system.net>
Run Code Online (Sandbox Code Playgroud)
添加这个没有帮助.
我创建了一个小型控制台应用程序,只是为了测试它..这里是:
static void Main(string[] args)
{
HttpWebRequest request = null;
try
{
String resolvedAddress = WebRequest.DefaultWebProxy.GetProxy(new Uri("http://www.google.com")).ToString();
Console.WriteLine("Proxy for address is: " + resolvedAddress);
Uri m_URLToTest = new Uri("http://www.google.com");
request = WebRequest.Create(m_URLToTest) as HttpWebRequest;
request.Method = "GET";
request.KeepAlive = false;
request.Timeout = 5000;
request.Proxy = WebRequest.DefaultWebProxy;
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream()); …Run Code Online (Sandbox Code Playgroud) 我正在从WinForms应用程序调用web服务.当代理服务器未被使用时,一切正常,但是当使用代理时,应用程序崩溃而不是它对SOAP请求所期望的XML响应,它会得到一个HTML错误页面,上面写着"需要身份验证".
您似乎可以手动设置代理,如下所示:
WebClient client = new WebClient();
WebProxy wp = new WebProxy("proxy server url here");
client.Proxy = wp;
Run Code Online (Sandbox Code Playgroud)
...但在某种程度上,似乎无论如何都没有看到代理服务器而没有执行上述操作,因为生成的错误实际上来自代理服务器.它似乎没有从用户的计算机中获取Windows身份验证登录凭据.我怎么强迫它这样做?
在我自己的机器上,如果我使用Fiddler模拟这个(并启用"需要代理身份验证"选项),我会弹出一个对话框询问登录凭据,但这似乎不会发生在我客户端的机器上(使用真正的硬件代理 - McAfee Web Gateway).
我怎么处理这个?我是否需要为用户提供一个手动配置服务器的对话框,或者是否有设置告诉WebClient使用Windows默认代理和用户自己的登录凭据?
更新
好像您可以使用下面的代码获取代理服务器,但这不会导致身份验证对话框出现在所有情况下(适用于某些PC但不适用于其他PC):
IWebProxy defaultProxy = WebRequest.DefaultWebProxy;
if (defaultProxy != null)
{
defaultProxy.Credentials = CredentialCache.DefaultCredentials;
client.Proxy = defaultProxy;
}
Run Code Online (Sandbox Code Playgroud)
如果上面的代码是正确的,我不明白为什么不会提示某些用户提供他们的凭据. 我是否必须输入自己的代码来收集用户凭据并将其提供给WebRequest对象?
我通过http代理连接互联网,我在localhost的一些web应用程序需要访问互联网.我在哪里可以为它们设置代理设置?
我想运行该svcutil.exe工具来访问互联网上的Web服务.不幸的是,每当我尝试时,我都会收到一堆包含以下消息的错误:
请求失败,HTTP状态为407:需要代理身份验证(ISA Server需要授权才能完成请求.拒绝访问Web代理筛选器.
正如我从这篇相关文章中了解到的(这里有更多详细信息),问题是我坐在验证代理后面.该帖子解释说我需要编辑app.config文件,但我无法弄清楚如何做到这一点.我想我会使用这个 /svcutilConfig:alternate_app.config开关,但我不知道如何构造一个有效的.config文件来传递给那个开关.svcutil.exe使用的默认app.config文件是什么?
我正在使用多个Intranet API来尝试构建一些具有所有应用程序共享的服务的应用程序.可以使用Javascript请求直接从GUI调用许多这些服务,但是其他服务器应用程序需要调用其中一些服务.
所有前端和API都使用Windows身份验证.现在我已将它设置为授权任何Windows身份验证用户.匿名身份验证已禁用.
我正在使用HttpClient从Web代码中连接到所需的服务.这是一个例子:
HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true });
client.BaseAddress = new Uri(ConfigurationManager.AppSettings["OtherServiceUrl"]);
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
SomeResponseObject responseObject;
HttpResponseMessage response = client.GetAsync("SomeController").Result;
if (response.IsSuccessStatusCode)
{
responseObject = response.Content.ReadAsAsync<SomeResponseObject>().Result;
}
else
{
throw new ApplicationException("API request not successful");
}
Run Code Online (Sandbox Code Playgroud)
好消息是,当我在本地运行服务时,这很好用.坏消息是,当我部署到IIS时,对Web服务的调用因未授权响应而失败.
经过大量的摆弄,我意识到我唯一一次获得未经授权的响应是指目标API的域与调用应用程序的域相同.它在我的本地盒子上运行,因为IIS express为每个应用程序分配了一个新端口.IIS中出现匹配域的情况,因为我在IIS中的同一站点下创建了调用应用程序和API作为应用程序,因此这两个应用程序看起来像是同一域中的目录.这几乎就像HttpClient如果注意到域匹配那样,就不会从调用Web应用程序发送身份验证.
我在同一台服务器上创建了一个新站点,但绑定到另一个端口并将API放在那里,然后再次尝试.果然,这解决了问题,来自API的请求通过就好了.
我可以把一堆子域来处理所有这些不同的服务,或者仅仅依靠以使独特的这些服务的域使用不同的端口,但它似乎有些奇怪,我认为这个限制是到位.有谁知道,如果有我可以在处理程序或客户端或别的东西,我可以做,以允许在同一个IIS站点运行的应用程序通过的HttpClient当使用Windows身份验证来相互交谈设置属性?
谢谢!
根据Sachin的建议,我也尝试将此添加到通过HttpClient发出API请求的应用程序的webconfig:
<system.net>
<defaultProxy useDefaultCredentials="true" />
</system.net>
Run Code Online (Sandbox Code Playgroud)
仍然没有运气.
我使用Facebook SDK .net,但我使用代理与身份验证连接到互联网我得到错误(407)(407)代理身份验证需要如何在Facebook SDK上设置身份验证
proxy ×5
c# ×4
.net ×2
iis ×2
.net-4.0 ×1
asp.net ×1
httpclient ×1
iis-7.5 ×1
pac ×1
soap ×1
svcutil.exe ×1
wcf ×1
web-services ×1
webclient ×1
winforms ×1