在WCF服务中使用WebClient

时间:2011-06-07 13:52:32

标签: wcf proxy webclient

我正在使用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上。

到目前为止的调查显示,差异是因为webproxy。 WPF应用程序中的webclient.proxy引用IE中设置的代理设置,而WCF中的代理设置没有。

为什么会这样?更重要的是,如何让WCF中的WebClient使用类似的代理设置?

编辑:我在WebClient上设置了代理,它在WCF服务中工作

webClient.Proxy = new WebProxy(ProxyAddressFromIE);

我在这里硬编码了代理addess。有哪些方法/ API可以获得一个?而且为什么它在WCF服务和它的不同之处呢?在WPF应用程序中?

3 个答案:

答案 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通信。

快乐狩猎。