如何从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
你的,杰拉尔德
如果你把所有的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)