【问题标题】:Reuse WCF contract interface, but retain use of declarative configuration重用 WCF 合约接口,但保留使用声明式配置
【发布时间】:2015-10-29 18:54:04
【问题描述】:

我们已经使用了这个旧主题("WCF Service Reference generates its own contract interface, won't reuse mine")中的解决方案,但这只是解决了重用接口的问题。如果可能的话,我们想做的是保留使用配置文件来设置和配置 WCF 客户端上的各种选项,使用 <system.serviceModel> 节点的所有花里胡哨。

所提供的方法迫使我们在代码中完成所有这些工作,而这在某一时刻已经被证明是一个问题(我们不得不更改绑定配置参数,这迫使我们完成整个公司变更请求批准流程更改代码库中的两行,与更改配置文件的请求相比,这是一个巨大的麻烦)。

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

【问题讨论】:

    标签: c# wcf .net-4.5


    【解决方案1】:

    假设您有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 创建Channel 以使用ServiceClient 端点配置访问IService 服务app.config

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

    【讨论】:

    • 啊,所以它实际上是ChannelFactory&lt;T&gt;构造函数中的一个参数。明白了,由于某种原因,我们完全错过了那个……谢谢。
    • 是的。但这也是一个可选的。如果您知道该应用程序中只有一个 Common.IService 客户端,您可以使用无参数构造函数,并且在配置中没有端点名称。
    【解决方案2】:

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

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

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

    【讨论】:

    • 不,不,我们不想使用“添加服务”或 SVCUTIL,我们可以手动或通过“编辑 WCF 配置”编辑器创建/修改配置文件。我们只想避免通过代码配置 WCF 客户端,同时仍保留使用共享服务契约的能力。
    • 再说一次,我不明白.... 使用共享服务合同并不排除使用通过 config 配置代理。为什么你觉得不是这样?
    • 好的,好消息,但是怎么样?我似乎无法绕过它。在我链接的 SO 问题中,我需要做什么/更改该代码才能从配置加载完整的绑定并获取我可以使用的接口实例?
    猜你喜欢
    • 2019-03-21
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2017-04-21
    相关资源
    最近更新 更多