重用WCF契约接口,但保留声明性配置的使用

本文关键字:配置 声明 保留 契约 WCF 接口 重用 | 更新日期: 2023-09-27 18:06:38

我们已经在这个老主题中使用了解决方案("WCF服务引用生成自己的契约接口,不会重用我的"),但这只解决了重用接口的问题。如果可能的话,我们想做的是保留使用配置文件来设置和配置WCF客户端上的各种选项,使用<system.serviceModel>节点的所有铃铛和口哨。

给出的方法迫使我们在代码中完成所有这些,并且已经证明这在某一点上是一个问题(我们必须更改绑定配置参数,这迫使我们通过整个公司更改请求批准过程来更改代码库中的两行,这与更改配置文件的请求相比是一个巨大的麻烦)。

是否有一种解决方案可以将这两个世界结合起来?

重用WCF契约接口,但保留声明性配置的使用

假设您有IService作为您的服务契约,并且它在客户端和服务器之间共享。

然后在客户端代码中,你会有这样的东西:

ChannelFactory<IService> factory = new ChannelFactory<IService>("ServiceClient");
var channel = factory.CreateChannel();
var result = channel.GetData(1);

在Client app. conf中,你应该有一个像这样的部分:

<system.serviceModel>
  <client>
    <endpoint name="ServiceClient" address="http://localhost:51377/service.svc" binding="basicHttpBinding"
            contract="Common.IService"/>
  </client>
</system.serviceModel>

简要说明ChannelFactory使用app.config中的ServiceClient端点配置创建Channel访问IService服务

你可以根据需要展开serviceModel配置。只需添加额外的代码,以便在操作完成后正确关闭通道。

你到底想要达到什么目标?似乎您正在尝试重用契约,但是SVCUTIL/VS生成ClientBase派生类并修改.config文件?

如果是这样,我不认为这是一个支持的场景,真的。老实说,如果需要重用服务契约接口,还不如手工实现基于ClientBase的代理类。这只是一点点额外的工作,从长远来看会让你的生活更轻松。

在SVCUTIL/VS中不支持只导入绑定配置而不是导入整个配置的选项,所以您可能还需要手工编写配置文件(或者从SVCUTIL的手动运行中复制它)。