我们的软件通过
使用许多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来完成?
非常感谢提前
你的,杰拉尔德
答案 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)