【问题标题】:Self hosting 2000+ web services through WCF通过 WCF 自托管 2000 多个 Web 服务
【发布时间】:2011-02-24 17:10:02
【问题描述】:

我正在寻找一种通过 WCF 公开许多(2000 多个)类似 Web 服务的方法。

我正在开发一个企业应用程序,其中业务逻辑通过类 (CQS) 打包。这些类组成了执行特定业务逻辑所需的所有数据。我想找到一种通过自托管将这些类公开为 Web 服务的方法。

所有这些类都只有一个动作(执行)。它们都继承自基类,并且每个类的属性都不同。基于实现的接口和属性,执行正确的业务逻辑。 Web 服务应该能够为属性提供值并执行操作。

其中最多 5% 将被定期使用。我知道创建 2000 多个服务主机实例是不可行的。如果这些主机实例是按需创建并在例如10 分钟不活动。理想情况下,我会对来自客户端的请求做出反应,并在需要时实例化主机。

编辑:
从反应中,我了解到我主要寻找的是一种不必注册所有端点的方法。我认为最可行的方法是我自己监听传入的请求并根据需要启动主机。

这可能吗?

【问题讨论】:

  • 为什么要自托管? Windows 激活服务(即 IIS)是否适合您?
  • 我知道 IIS 是一种选择,但我更喜欢自托管。如果自托管不起作用,我将求助于 IIS。

标签: c# .net wcf web-services


【解决方案1】:

为什么不拥有一个具有请求/响应架构的主服务,这样您就只有一个 Web 服务但具有多种方法或请求类型?您可以使用 MEF 或其他东西将其作为插件架构。它可以根据需要启动事物并在不需要时关闭它们。它还可以减少您的网络占用空间。

【讨论】:

  • 这样做的问题是,当客户端请求 WSDL 时,他会得到一个包含 2000 多种类型的 WSDL。理想情况下,我希望每个 Web 服务都有一个 WSDL。公开地,它应该看起来是单独的 Web 服务,客户端应用程序可以注册到每个 Web 服务。
  • 这并不是我真正想要的答案,但你让我朝着正确的方向前进。非常感谢。
【解决方案2】:

除非我误解了你写的东西。您有 2000 多个服务都实现了一个通用的基础服务合同?

难道你不能使用依赖注入来根据请求的特定接口提供正确的具体服务吗?

因此,您提供了一个主机,但创建了您自己的实例提供程序,该提供程序使用请求的 ServiceType 将请求转发到正确的实例类型。

有点像 WCF DISwitchable WCF Service 但不完全一样。

【讨论】:

  • 虽然这对我有一点帮助,但我仍然有注册端点的问题。为了能够提供服务,我必须设计一种方法让端点在某处注册,要么让它们全部显式注册,要么能够侦听传入请求并按需启动主机或端点。对此有何建议?
  • 可能会使用更灵活的 Execute 方法提供单个/更少的服务。 Maybe 接受一个 DataContract,它提供了更多关于可以使用哪个底层服务来为请求提供服务的详细信息。如果不这样做,滥用架构会更有用吗?你可以有很多消息,当发送到总线时,任何对特定类型的消息感兴趣的服务都会对其进行操作。
【解决方案3】:

我不明白为什么您需要多个端点。对于每个命令类,公开一个操作:

[OperationContract]
void ExecuteClassACommand(ClassA command)
{
    command.Execute();
}

您可以在每次添加或删除命令类时自动生成操作。

【讨论】:

  • 这样做的问题是,这会创建一个巨大的 WSDL,例如松开原始类的命名空间分组。然而,这仍然可以通过创建多个类来解决,但我更希望动态生成这一层,而不是通过接口,例如使用动态代理。但是我仍然想知道是否有可能闯入自托管 WCF BasicHttpBinding 的 HTTP 服务器并以这种方式解决我的一些问题。
  • 因此,将 2000 个类分组为子集,使每个子集成为服务合同,然后托管十个左右的服务。您可以将服务循环添加到 ServiceHost。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 2012-09-06
相关资源
最近更新 更多