none
WCF如何加载外部工程契约和服务 RRS feed

  • 问题

  • 场景:

    想做一个单纯控制台的WCF服务宿主,该工程里面没有任何契约定义和服务实现。由A工程(或其它多个工程)定义契约,B工程(或其它多个工程)分别实现A中定义的契约。这样以来,文件结构如下:一个exe控制台程序,多个dll契约文件和多个dll服务文件。

    问题:

    不能通过app.config的配置加载契约和服务。

    尝试:

    1. 当将契约和服务写入exe的app.config文件中时,启动宿主,无法通过Type.GetType(xxx)获取到契约或服务的定义,经查证,exe所在应用里面根本没有相关dll的定义,也未加载;

    2. 将所有需被加载的dll在创建ServiceHost之前加载到应用exe的domain里面(采用FileStream.LoadFrom方式加载),Type.GetType(xxx)能够成功。

    总结:

    2的处理方式,感觉有点不灵活甚至有点傻傻的,或者不是我想要的处理过程,不知道各位是如何实现这样的使用场景的?在此请教。


    QQ: 79965521 Email: WolfLai@126.com
    2011年7月26日 5:53

全部回复

  • Hi,

    我觉得你可以把你的解决方案分成:
    1,一个工程定义为服务契约(主要是接口)。
    2,另外一个工程为具体服务类的实现(即接口的实现类)。或者你也可以将接口与服务类放在一个工程下面。
    3,再定义一个终结点(Endpoint)工程,主要是一些.svc文件,
    你可以将WCF部署在IIS上(只须将Endpoint工程下的所有.svc文件部署在IIS下就可以),这样就可以不须要控制台宿主WCF服务了。

     


    Please mark the replies as answers if they help or unmark if not. If you have any feedback about my replies, please contact msdnmg@microsoft.com Microsoft One Code Framework
    2011年7月28日 9:24
    版主
  • 这个设计思路没错。

    不过你不需要自己控制DLL的加载过程。

    WCF服务的托管宿主程序在运行开始阶段会自动查找运行需要的DLL,首先应该是Bin目录吧。

    也就是Exe运行的目录。

    项目拆分多少,只是个程序集引用的问题。

    不影响WCF服务的正常运行


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

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

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

    Windows Azure中文技术论坛

    2011年7月29日 8:15
    版主
  • Hi, Frank, 不好意思,出差归来才来关注帖子。

     

    是这样的,WCF宿主是根据App.config自动查找需要的DLL吧。我就是想通过改变App.config的配置来控制宿主能提供的服务。

     

    问题在这里,我把所有服务契约和服务实现的DLL都放在bin目录了,然后在App.config中添加部分服务和契约。当宿主启动时,能读取到App.config中的配置,但是,在Type.GetType创建ServiceHost类型时,不能根据配置中的类型生成,老是NULL。断点查看时,发现是GetType中的类型没有在当前程序集中。正如我所说,LoadFile相关服务实现的DLL后就能顺利通过了。但这样一来,灵活性非常差。

     

    谢谢。


    QQ: 79965521 Email: WolfLai@126.com
    2011年8月2日 2:58
  • Hi, Peter, 控制台宿主是项目要求,不是很容易被改变。

    另,以前尝试Win7下部署WCF时,总是不成功。不知道有没有什么技巧或者什么地方需要特别处理的?Google了很多处理方式,都没有能够解决。如可能,请不吝赐教。

     

    谢谢。


    QQ: 79965521 Email: WolfLai@126.com
    2011年8月2日 3:03
  • Hi, Frank, 不好意思,出差归来才来关注帖子。

     

    是这样的,WCF宿主是根据App.config自动查找需要的DLL吧。我就是想通过改变App.config的配置来控制宿主能提供的服务。

     

    问题在这里,我把所有服务契约和服务实现的DLL都放在bin目录了,然后在App.config中添加部分服务和契约。当宿主启动时,能读取到App.config中的配置,但是,在Type.GetType创建ServiceHost类型时,不能根据配置中的类型生成,老是NULL。断点查看时,发现是GetType中的类型没有在当前程序集中。正如我所说,LoadFile相关服务实现的DLL后就能顺利通过了。但这样一来,灵活性非常差。

     

    谢谢。


    QQ: 79965521 Email: WolfLai@126.com

    动态控制程序集加载,应该可行,不过反射不是可能导致性能问题吗。你可以尝试尝试
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

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

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

    Windows Azure中文技术论坛

    2011年8月29日 9:34
    版主