如何从Channelfactory创建c#-SoapClient

时间:2014-03-27 11:57:38

标签: c# app-config soap-client webservice-client channelfactory

我们的软件通过

使用许多WebService调用
sc = new MyServiceSoapClient() 

这个构造函数读了 Winword.exe.config中的EndpointAddress和绑定以及行为 (这是因为软件是一个winword的Addin)

但客户要求我们不要触摸Winword.exe.config文件。

所以我们改变了从ChannelFactory创建频道的策略 因为在这种情况下我们可以使用我们喜欢的任何“.config”文件。

不幸的是,我们从ChannelFactory获得的频道是“MyServiceSoap”,但它不是“MyServiceSoapClient”。

我们不希望通过创建的频道进行每个WebService调用 因为这意味着我们重新实现了很多这样的调用:

  
    
      

创建请求对象

             

调用WebService方法

             

从响应对象中读取结果。

    
  

所以我们尝试以这种方式实现MyServiceSoapClient:

sc = new MyServiceSoapClient(chfact.Endpoint.Binding, chfact.Endpoint.Address)

这很好用,我们终于从任何“.config”文件中获取了SoapClient,而且我们不依赖于Winword.exe.config文件。

但是由于安全原因,客户在配置文件中添加了一些行为。

好吧,channelFactory当然从配置文件中读取了行为,但没有像这样的构造函数:

sc = new MyServiceSoapClient(Binding, Address, Behavior)

所以我们无法从现有的MyServiceSoap频道创建一个完全有效的MyServiceSoapClient。

如果我们使用默认构造函数创建MyServiceSoapClient,则行为可以正常工作 - 但是客户需要配置他拒绝执行的Winword.exe.config。

也不可能像这样进行类型转换:

sc=(MyServiceSoapClient)channel;

因为channel是MyServiceSoap接口。

问题:

有没有办法从MyServiceSoap-channel或channelFactory创建MyServiceSoapClient?

或者可以通过一些复杂的Type-Casting来完成?

非常感谢提前

你的,杰拉尔德

1 个答案:

答案 0 :(得分:0)

如果将所有wcf配置放在外部文件中,这样您就不需要再次触摸winword.exe.config了:

<system.serviceModel>
   <bindings configSource="bindings.config" />
   <behaviors configSource="behaviors.config" />
   <client configSource="client.config" />
   <services configSource="services.config" />
  .....
</system.serviceModel>

因此,对于<system.serviceModel>中的每个部分,您可以使用configSource=属性指定外部配置文件(并且不要让Visual Studio的红色波浪线混淆它 - 是的, DOES 工作!)。

您可以针对任何配置执行此操作部分 - 但遗憾的是,对于整个部分组<system.serviceModel>,无法执行此操作)。

(这是从这个答案复制而来的:https://stackoverflow.com/a/1598776/725866