如何从Channelfactory创建c#- soapclient

本文关键字:c#- soapclient 创建 Channelfactory | 更新日期: 2023-09-27 17:54:13

我们的软件通过

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

,这个构造函数读EndpointAddress和Binding and Behavior from Winword.exe.config(这是因为我们的软件是一个winword插件)

但是客户要求我们不要碰windows .exe.config文件。

所以我们改变策略,从ChannelFactory创建一个通道因为在这种情况下我们可以用any "。

不幸的是,我们从ChannelFactory获得的通道是"MyServiceSoap",但它不是"MyServiceSoapClient"。

我们不想通过创建的通道来执行每个WebService调用因为这意味着我们要重新实现很多这样的调用:

创建请求对象

调用WebService方法

读取响应对象的结果。

所以我们尝试这样实例化MyServiceSoapClient:

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

这个工作得很好,我们终于得到了我们的SoapClient从任何"。我们不依赖于windows .exe.config文件

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

当然,channelFactory会从配置文件中读取Behavior,但是没有这样的构造函数:
sc = new MyServiceSoapClient(Binding, Address, Behavior)

所以我们不能从现有的MyServiceSoap-channel中创建一个完全有效的MyServiceSoapClient。

如果我们用MyServiceSoapClient的默认构造函数创建它,那么行为就会正常工作-但是客户需要配置他拒绝做的Winword.exe.config。

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

sc=(MyServiceSoapClient)channel;

因为channel是一个MyServiceSoap接口

问题:

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

或者可以通过一些复杂的类型转换来完成?

many thanks in advance

你的,杰拉尔德

如何从Channelfactory创建c#- soapclient

如果你把所有的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)