【发布时间】:2014-03-27 11:57:38
【问题描述】:
我们的软件通过
使用了许多 WebService 调用sc = new MyServiceSoapClient()
这个构造函数读取 Winword.exe.config 中的 EndpointAddress 和绑定和行为 (这是因为out软件是winword插件)
但是客户要求我们不要碰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 ?
或者可以通过一些复杂的类型转换来完成吗?
提前多谢
你的,杰拉德
【问题讨论】:
标签: c# app-config soap-client webservice-client channelfactory