我正在使用WebClient以下列方式下载某些资源:
Stream stream;
try
{
WebClient webClient = new webClient();
stream = webClient.OpenRead(MyResourceUri);
}
catch (Exception)
{
return null;
}
return stream;
当我在WPF应用程序中执行此操作时,它可以正常工作并获得正确的流。
当我在WCF服务调用中执行此操作时,它不起作用。抛出WebException并显示消息"Unable to connect to remote server"
。 (适用于托管在我的计算机上或公司网络中的文件,但是对于网络上的任何资源都无法使用)。该服务托管在IIS7上。
为什么会这样?更重要的是,如何让WCF中的WebClient使用类似的代理设置?
编辑:我在WebClient上设置了代理,它在WCF服务中工作
webClient.Proxy = new WebProxy(ProxyAddressFromIE);
我在这里硬编码了代理addess。有哪些方法/ API可以获得一个?而且为什么它在WCF服务和它的不同之处呢?在WPF应用程序中?
答案 0 :(得分:2)
我需要做同样的事情,我在这里找到答案:Get the URI from the default web proxy。基本上,您需要使用WebRequest.GetSystemWebProxy()
动态读取代理,并使用测试代理URL确定代理。
希望这有帮助!
答案 1 :(得分:2)
要回答您的一个问题,您的WPF应用程序与IIS托管的WCF服务之间存在差异的原因是这样的。
WPF应用程序在实际的Windows会话中运行(确切地说,您的用户会话)。这意味着为该会话加载了一个用户配置文件,该会话除其他外包含IE中配置的代理设置。
IIS中托管的WCF服务不在Windows会话中运行。它们作为服务运行,因此没有Windows会话(它们实际上在会话0中运行,但这只是一个实现细节)。这意味着没有代理配置。
要可靠地解决这个问题,您可以拥有自己的代理配置,可能在web.config中。 另一个选择是通过netsh.exe配置代理。
答案 2 :(得分:0)
考虑使用高度抽象的WebClient以外的源来处理调用。从较高层到较低层,这意味着将WebRequest和WebResponse对象一直探索到套接字编程。原因是WebClient方法与Internet Explorer中的选择紧密耦合,因为很多高级Internet堆栈都在Windows中。如果你想解决这个问题,你需要深入挖掘。
我很想指出准确挖掘的地方,但我没有遇到这个问题,也没有经验解决。我知道在哪里寻找答案,但没有关于“X标记现场”的具体细节。但是,由于WebClient的高级别,高度抽象性,我不确定你是否可以轻松绕过隐式创建堆栈和/或与IE的耦合,而不是更多的麻烦而不是使用更明确的对象控制HTTP通信。
快乐狩猎。