一种服务,两种行为配置

时间:2010-08-11 07:46:51

标签: c# .net wcf

是否可以使用两种行为配置的服务?如您所知,可以有一个服务和多个端点,您可以在其中指定不同的绑定配置。 但是,对于相同的服务,我需要具有不同的服务行为。

如果我尝试这样的话:

<services>
  <service name="Service.Service1" behaviorConfiguration="Behavior1">
    <host>
      <baseAddresses>
          ...
      </baseAddresses>
    </host>

    <endpoint ...>
    </endpoint>
  </service>

  <service name="Service.Service1" behaviorConfiguration="Behavior2">
    <host>
      <baseAddresses>
          ...
      </baseAddresses>
    </host>

    <endpoint ...>
    </endpoint>
  </service>
</services>

...我收到错误“在相同的配置范围内已经存在一个名为'service'且具有相同密钥的子元素”

我知道我可以创建继承原始服务类的新类但是有更好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

似乎您应该使用其他服务名称注册相同的服务类。服务行为是服务配置的一部分,因此如果要使用不同的行为,则应配置不同的服务。我向你提出的问题:如果你有一项服务有两种行为,wcf将如何决定使用这种或另一种? 为什么你的继承解决方案不好?

答案 1 :(得分:1)

相当有趣的问题......我不确定我所描述的内容是否可行,但解决方案将如下所示:

  1. 为服务选择不同的名称 - 会有一些方案,例如name =“Service.Service1.Entry1”
  2. 编写自定义ServiceHost(可能与IInstanceProvider结合使用),它将忽略最后一个.Entry1部分,并使用Service.Service1名称创建服务实例。
  3. 另一种方法是在应用程序初始化时注入从Service.Service1继承的名为“Service.Service1.Entry1”的动态类型。这部分是非常可能的 - 即对于每个提到的服务,您将在应用启动时动态创建n个子类型,以便您可以按预期使用它们。