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

Reuse WCF contract interface, but retain use of declarative configuration

我们使用了这个老话题("WCF Service Reference generates its own contract interface, won't reuse mine")的解决方案,但那只是解决了接口重用的问题。如果可能的话,我们还想保留配置文件的使用,以便使用 <system.serviceModel> 节点的所有功能在 WCF 客户端设置和配置各种选项。

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

是否有结合这两个世界的解决方案?

您要实现的目标到底是什么?似乎您正在尝试重用合同,但是 SVCUTIL/VS 生成了 ClientBase 派生的 class 并修改了 .config 文件?

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

SVCUTIL/VS 中不支持仅导入绑定配置而不是整个配置的选项,因此您可能还需要手动编写配置文件(或复制它来自 SVCUTIL 的手册 运行)。

假设您有 IService 作为您的服务合同,它在客户端和服务器之间共享。

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

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

在客户端 app.cofnig 中,您会有一个如下所示的部分:

<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配置。只需添加额外的代码即可在操作完成后正确关闭频道。