【问题标题】:Simplified WCF configuration on server and client简化服务器和客户端上的 WCF 配置
【发布时间】:2013-09-25 23:07:45
【问题描述】:

我们正在将旧版 .Net Remoting 服务迁移到 WCF。在阅读了一段时间后,我偶然发现了这个元数据谈话并在客户端上动态构建代理:看起来很有希望。

如果可能的话,我想要实现的是在一个 Web 应用程序上以最少的配置公开服务(即,配置文件中没有显式的 <services> 节点),并在客户端中构建代理(通过共享接口)也只需最少的配置。

我知道默认情况下可以公开所有服务的元数据,但这似乎是无用的,因为它为每个服务生成不同的 url,然后我需要在我的客户端上维护几十个硬编码字符串.

这是我当前的配置文件:

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

我想在服务器上有一个单一的 URL(可能是基地址本身,'http://localhost/VirtualDir')并使用这个端点自动解析来自客户端的任何服务接口。我遇到了this somewhat old post,这或多或少是我想要实现的。当时,似乎没有任何方法可以优雅地做到这一点。

难道没有办法在服务器上公开单个 MEX 端点,然后解析其上的任何合约接口吗?这样我就可以:

  1. 在客户端存储单个 URL
  2. 使用给定接口的MetadataResolver 类检索端点
  3. 使用解析的端点使用ChannelFactory&lt;T&gt; 创建代理

我想在某种工厂类中执行此操作,并将其与 Unity IoC 容器一起使用。

我认为我仍然可以使用某种约定来完成这项工作,以使用已知格式构建许多真实的端点地址。不过我想避免这种情况,因为它仍然会导致问题。

【问题讨论】:

    标签: .net wcf .net-4.0


    【解决方案1】:

    我可以想到两种方法来解决这个问题:

    1. 使用 WCF 路由服务并使用 filters 根据肥皂动作或其他内容进行路由。
    2. 创建一个端点来处理请求中的Message 实例,然后在内部处理convert 它们。

    WCF 路由的缺点是它本身就是另一个 WCF 服务。而且我不确定选项 2 是否完全符合您的描述。

    检查此MSDN magazine article

    此外,MetadataResolver 主要用于客户端在调用服务之前动态解析服务上的端点。正如您所描述的,我之前没有在服务端看到过这种情况。

    此外,还有一个小问题,WCF 旨在用于定义两个应用程序通信所跨越的显式边界。这种分离是明确的,并表示为对抽象的、冗长的外部合同的相互接受。在我看来,试图摆脱这种明确的契约会让人质疑为什么你首先需要边界。如果可以的话,调用进程内运行的服务几乎总是更好。

    【讨论】:

    • 我认为您从我的问题中误解了一些内容。我不建议在服务器上使用 MetadataResolver。我想要实现的是到服务器的单个 URL,然后在客户端上使用 Resolve,传递所需的接口。至于进行中的通话,我不确定我明白你在说什么。我们需要这些调用是远程调用,因为服务器是 Web 应用程序,而客户端是其他 Web 应用程序、Windows 服务或桌面应用程序。我会看看这个路由选项是如何工作的,谢谢你的提示。
    • 刚开始阅读路由服务后,我发现它只支持 SOAP 消息?这将是一个交易破坏者,因为我们在某些地方使用泛型列表,而 SOAP 序列化程序无法处理泛型类(我们目前对所有服务都使用二进制序列化)。
    • 无赖 - 对不起,我无法提供更多帮助。关于进程中的事情 - 已经注意到人们在不需要他们的地方引入了服务边界 - 但听起来你不是其中之一;)
    • 啊,好吧,我明白你为什么建议现在直接打电话了。不幸的是,这对我们来说确实不是一个选择。我们的系统上有一堆组件,每个组件都可能位于网络上的不同计算机上,甚至跨网络。此外,每个组件都有非常不同的职责,因此即使可以直接调用方法,我们也必须共享许多其他类、配置文件、连接字符串和类似的东西才能使调用在本地工作。我觉得这样做会严重违反 SRP,而且管理起来也会很混乱
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多