在共享mex端点的单个Windows服务中动态托管多个WCF服务的最佳方法是什么?

时间:2012-02-23 21:02:31

标签: wcf

我收到了在单个Windows服务中动态托管多个WCF服务的请求。

要求如下:

  • 服务是实现某些服务合同接口的单一实例。
  • 在编译时不知道服务 - 在运行时,将一组未知单重服务传递给应用程序。
  • 所有服务都通过相同的mex端点公开
  • 端点以编程方式设置(不使用app.config)

我尝试用两种不同的方法解决问题:

  • 第一种方法是为每个服务实例创建和打开ServiceHost。这种方法的问题是每个ServiceHost都是通过自己的mex端点公开的。
  • 第二种方法是为所有服务创建一个ServiceHost,并通过相同的mex端点公开它们。

我尝试了几种方法来实现第二种方法:

  • 第一种方法是在运行时(使用CodeDom或Reflection.Emit)创建一个包装所有实例的服务类型,并实现所有服务契约并将给定的方法调用路由到合适的服务实例。这有效但似乎有点矫枉过正。 (我宁愿在可能的情况下不生成代码)
  • 第二种方法是以编程方式为请求的合同设置ServiceEndpoints。我修改了this following code example,因此它将方法调用路由到相应的服务实例的方法。此解决方案的问题在于,为了将ServiceEndpoint与其ChannelDispatcher相关联而进行了一次黑客攻击。

我错过了其他方法吗?无论如何要克服我提到的问题吗?

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,那么一种方法是在单个服务类中实现多个合同接口。通过这样做,您应该能够从单个mex端点获取元数据。这是一个非常简单的例子:

[ServiceContract]
public interface IServiceContract1
{
    [OperationContract]
    bool DoStuff1();
}
[ServiceContract]
public interface IServiceContract2
{
    [OperationContract]
    bool DoStuff2();
}

public class ServiceContractImplementation: IServiceContract1, IServiceContract2
{
    bool DoStuff1()
    {
        return true;
    }
    bool DoStuff2()
    {
        return true;
    }
}

然后在web.config中(或在你的情况下的代码中):

<service name="ServiceImplementation">
        <endpoint binding="basicHttpBinding" contract="IServiceContract1"/>
        <endpoint binding="basicHttpBinding" contract="IServiceContract2"/>
        <endpoint address="mex" contract="IMetadataExchange" />
      </service>