百宝箱教你解决WCF自宿主问题

开发 后端
这里就WCF自宿主Main()方法中使用如下定义的助理类ServiceHost实现的和为了把这个服务宿主在一个Windows表单应用程序中两个案例分析。

经过长时间学习WCF,对WCF也有一定程度上的认识了解,这里就发表下我的言论吧。WCF自宿主是当开发者负责提供和管理宿主进程的生命周期时使用的技术名词。自宿主被应用在位于客户端和服务之间的一个进程(或计算机)边界环境中,以及当使用进程中服务的情况下(也就是说,与客户端处于相同的进程中)。

#T#你需要提供的进程可能是任何Windows进程,例如,一个Windows表单应用程序,一个控制台应用程序或一个Windows NT服务。注意,该进程必须在客户端调用服务之前先运行起来;典型情况下,这意味着,你必须预先启动它。对于NT进程中服务来说这并不是一个问题。类似于IIS宿主,WCF自宿主应用程序配置文件必须列出你想宿主的服务的类型并且暴露给外界。而且,该宿主进程必须在运行时刻显式地注册服务类型并且打开该宿主以便于客户端调用。典型地,这是在Main()方法中使用如下定义的助理类ServiceHost实现的:

  1. public interface ICommunicationObject : IDisposable  
  2. {  
  3. void Open();  
  4. void Close();  
  5. //更多成员  
  6. }  
  7. public abstract class CommunicationObject :  
  8. ICommunicationObject  
  9. {...}  
  10. public class ServiceHostBase : CommunicationObject,...  
  11. {...}  
  12. public class ServiceHost : ServiceHostBase,...  
  13. {  
  14. public ServiceHost(Type serviceType,  
  15. params Uri[]baseAddresses);  
  16. //更多成员  

提供给ServiceHost的构造函数的信息有:服务类型和(可选)默认的基地址。该基地址集可以是一个空集(以后,你可以配置不同的基地址)。拥有一组基地址能够使服务接受在多个地址和协议上的调用。注意,每个ServiceHost实例都关联与一个特定的服务类型,并且如果宿主进程需要宿主多个类型的服务的话,你需要一些匹配的ServiceHost实例。通过调用宿主中的ServiceHost.Open()方法,你允许调入(call- in);并且通过调用ServiceHost.Close()方法,你可以体面地退出宿主实例并完成到当前客户端的数据发送,并且还要拒绝未来的客户端调用-即使宿主进程仍在运行中。典型地,关闭操作是在WCF自宿主进程关闭时实现的。例如,为了把这个服务宿主在一个Windows表单应用程序中:

  1. [ServiceContract]  
  2. interface IMyContract  
  3. {...}  
  4. class MyService : IMyContract  
  5. {...}  
  6. 你可以编写:  
  7. public static void Main()  
  8. {  
  9. Uri baseAddress = new Uri("http://localhost:8000/");  
  10. ServiceHost serviceHost;  
  11. serviceHost = new ServiceHost(typeof(MyService),baseAddress);  
  12. serviceHost.Open();  
  13. //能够拦截调用:  
  14. Application.Run(new MyForm());  
  15. serviceHost.Close();  
  16. }  
责任编辑:田树 来源: 博客
相关推荐

2009-11-09 11:31:47

WCF消息队列

2009-10-28 09:48:31

VB.NET XmlR

2015-09-22 16:11:41

SDNDocker

2015-09-22 15:24:27

SDNDocker

2009-10-28 13:54:38

linux安装显卡驱动

2011-04-13 09:40:27

2009-10-28 12:05:32

linux监控技术

2009-11-03 16:57:34

ADO.NET FAQ

2009-11-12 14:18:19

ADO.NET分页

2009-10-28 18:35:10

Linux基础用户

2009-10-27 13:14:35

VB.NET窗体应用

2009-10-28 14:51:33

VB.NET设计制作窗

2009-11-03 16:17:39

ADO.NET Ent

2009-10-27 15:42:04

VB.NET文件对象

2009-11-16 14:52:16

PHP数组

2009-11-18 18:18:10

PHP Web查询数据

2016-01-14 14:17:51

密码管理密码分析安全工具

2017-07-05 11:09:35

华为开发云

2023-07-24 08:27:38

点赞
收藏

51CTO技术栈公众号