none
wcf host多个服务的问题,我知道这是个老问题,可实在找不到好的解决方案 RRS feed

  • 问题

  • 项目比较大,不可能所有契约在一个类里来实现,可能会有上百个服务上千个契约,按照目前在网上搜索的结果是。。。

    只能一个servicehost对应一个服务,某个mvp的建议是所有契约都放到一个类里来实现。。。我很崩溃

    也有人建议用 partial class的方式,把不同的契约分布到不同的CS文件里,虽然可能看上去好一点,但每回添加服务都得重编译,我觉得太扯淡了。

    我希望是尽可能的把服务根据功能的不同按模块划分开来,不同的服务做成不同的dll,以插件的形式注册到一个表里,用servicehost来加载,不知大家有没有好的建议

     不知道c#或者.net有没有类似com中queryinterface的机制,例如我有一个类
    class MyServices
    以前在com中可以通过实现queryinterface来返回用户给定的接口,
    那么在C#或.net中,当系统对MyServices进行转型到特定接口类型时,有没有一种机制能让我进行操作和干涉,来返回系统所需的接口类型呢??

    我的设想是把我的所有服务注册到一个表里,用一个host把MyService加载起来后,无论客户端需要何种契约服务,都通过MyService进行查表操作,如果有注册的服务则返回

    是否有实现的方法??

    如果确实没办法实现,只能一个服务对应一个servicehost,那么我在一个进程里打开上百个servicehost会否有问题??

    2010年10月19日 8:17

答案

  • 你想要解决两个问题:

    1,在一个进程中启动多个服务;

    2,客户端如何发现服务;

    针对问题1,IIS就是一个很好的例子,它就可以宿主多个服务,如果你用自宿主,.Net StockTrader就提供了很好的示例,当然,你可以通过扩展,修改为在特定应用程序域来启动多个服务;

     

    针对问题2:

    一,可以使用WS-Discorvery来实现,

    二,使用消息路由(wcf router service),将特定契约的消息路由到指定的服务端口.

    • 已标记为答案 Mog Liang 2010年10月26日 7:52
    2010年10月25日 8:22

全部回复

  • 呵呵,希望给你建议的不是我啊。

    我没做过这个Case.

    不过提点参考意见。

    1。C#里的反射或许可以实现你的需求。

    2。如果自己控制servicehost和服务实例化过程,恐怕有点复杂。不过你可以尝试一下,在服务接收到客户端消息以后,判断调用的是什么服务契约,然后再来实例化服务。(我猜测可以,没做过测试)

    3。关于服务契约的设计,如果你系统有成百上千的服务契约,那么重新考虑你的设计,显然不能把所有的操作定义在一个契约里,或者在一个服务类里实现。一般服务的划分推荐和业务逻辑相关,契约设计与接口设计规则类似。

    4。宿主,推荐使用IIS,尽量减少你对于实例化、多线程等细节控制工作。如果使用自定义的Host,恐怕控制起来,也会遇到很多额外的问题。


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    2010年10月20日 2:29
    版主
  • 你想要解决两个问题:

    1,在一个进程中启动多个服务;

    2,客户端如何发现服务;

    针对问题1,IIS就是一个很好的例子,它就可以宿主多个服务,如果你用自宿主,.Net StockTrader就提供了很好的示例,当然,你可以通过扩展,修改为在特定应用程序域来启动多个服务;

     

    针对问题2:

    一,可以使用WS-Discorvery来实现,

    二,使用消息路由(wcf router service),将特定契约的消息路由到指定的服务端口.

    • 已标记为答案 Mog Liang 2010年10月26日 7:52
    2010年10月25日 8:22
  • 楼主的遇到的问题,我也同样遇到。实际的商业应用不可能把成百上千个契约放在一个*.svc里面。

    另外楼市上的朋友说IIS就是很好的例子不知道你的例子是怎么样的:

    1.将n个契约放在一个服务里面如http://test.wcf.com/Service.svc。这一个服务就是在IIS上部署一个站点。

     2.将那个契约分别放在http://test1.wcf.com/Service.svc,http://test2.wcf.com/Servic.svc,http://test2.wcf.com/Servic.svc等3个服务里面。这三个服务就是在IIS上部署3个站点。

    现在是否有办法:在IIS上不是一个站点儿达到http://test.wcf.com/Service1.svc,http://test.wcf.com/Service2.svc,http://test.wcf.com/Service3.svc实际上,我测试过这样是可以的。

    是能正常访问,但是在web.config里面配置的比如证书,客户端用户名安全的安全方式就通通不起作用了。

    谁能给我一个,在IIS同一个站点上部署若干个服务,并且每个服务都是基于消息用户名密码安全的例子。

    2010年11月21日 5:40
  • 可以考虑用CSLA.NET的方案,只写一个服务,它称为统一入口,这个方式还是不错的,就是他为解决并发,并发好像在博客园里有人写了怎么实现
    菜鸟
    2010年11月22日 12:55
  • 这个问题我也一直关注。

    最近我在IIS7宿主WCF服务,并且多个服务也成功,或许你可以尝试一下。

    2010年12月8日 9:57
  • 目前我做的开发是WCF采用TCP绑定,部署在IIS7上,在用户认证和状态保留方面的确有些小问题。不过我觉得可以对servicehost进行归类,不能开启太多了,很耗费资源。


    你随时可以开始!
    2010年12月9日 7:05
    版主