WCF服务怎样与宿主程序交互

WCF服务必须host到一个宿主程序中才能够使用,但WCF服务如何与宿主程序进行交互呢?

如果宿主程序只是请求WCF服务的一个Operation很简单,只需要添加服务引用,像普通的客户端那样开发就可以了。

但如果希望当WCF服务被访问的时候主动与宿主程序进行交互,则如何处理呢?这里用个例子来说明:WCF服务WAFService继承自IWAFService,其只有一个Operation:void DisplayContent(string content),该服务host在一个WinForm程序中,当客户端访问DisplayContent时,参数content的内容将在WinForm的List控件LBContent中被显示。

这里有两个重点:

一是需要对WCF服务进行较多的控制,因此需要用构造函数ServiceHost(Object, Uri()),而不是通常的ServiceHost(Type, Uri()),前者直接把WCF服务实例传递给ServiceHost对象,因此WCF服务的实例管理必须是Single即InstanceContextMode = InstanceContextMode.Single,而后者传递的只是WCF服务的类型,由ServiceHost来决定如何在适当的时候创建和销毁WCF服务实例;

二是在WCF服务的类定义中,需要添加一个公开的delegate,当WCF服务的Operation被调用时用来回调宿主程序中的方法。

该实例程序的主要代码如下所示:

[csharp]  view plain copy
  1. namespace WFAWCF  
  2. {  
  3.     public delegate void DisplayContent(string content);  
  4.       
  5.     [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]  
  6.     public class WAFService : IWAFService  
  7.     {  
  8.         public DisplayContent AddContent = null;  
  9.   
  10.         public void DealWithContent(string content)  
  11.         {  
  12.             if (!string.IsNullOrEmpty(content))  
  13.             {  
  14.                 if(null != AddContent)  
  15.                     AddContent(content);  
  16.                 Console.WriteLine(content);  
  17.             }  
  18.         }  
  19.     }  
  20. }  
WCF服务程序



[csharp]  view plain copy
  1. namespace WFAWCF  
  2. {  
  3.     public partial class Form1 : Form  
  4.     {  
  5.         private ServiceHost host = null;  
  6.         public Form1()  
  7.         {  
  8.             InitializeComponent();  
  9.         }  
  10.   
  11.         private void Form1_Load(object sender, EventArgs e)  
  12.         {  
  13.             LBContent.Items.Clear();  
  14.   
  15.             WAFService service = new WAFService();  
  16.             service.AddContent += this.AddContent;  
  17.             host = new ServiceHost(service);  
  18.             host.Open();  
  19.         }  
  20.   
  21.         private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
  22.         {  
  23.             if(null != host)  
  24.             {  
  25.                 host.Close();  
  26.             }  
  27.         }  
  28.   
  29.         public void AddContent(string content)  
  30.         {  
  31.             LBContent.Items.Add(content);  
  32.         }  
  33.     }  
  34. }  

宿主程序


对于不太重要的接口定义和配置程序,在此略去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值