很多时候我们会遇到,信息及时推送通知的情况,例如:监控设备时及时推送状态、报警信息等,我们就可以用WCF的回调机制来实现,下面以一个监控设备名字为例,如果设备名字发生改变,服务器就马上推送消息给客户端:
(一、)服务器端
1、建一个控制台应用程序:CallbackContractWCF
2、创建ISendMessage接口
namespace CallbackContractWCF { [ServiceContract(CallbackContract = typeof(IMessageCallbackContract))] public interface ISendMessage { /// /// 保存客户端回调的实例 /// [OperationContract] void Subscribe(); } }
3、创建用于推送消息回调的接口IMessageCallbackContract
namespace CallbackContractWCF { public interface IMessageCallbackContract { [OperationContract(IsOneWay = true)] void ReportMes(string responseToGreeting); } }
4、创建实现接口ISendMessage的类SendMessage
1 namespace CallbackContractWCF 2 { 3 [ServiceBehavior(InstanceContextMode=InstanceContextMode.Single,ConcurrencyMode=ConcurrencyMode.Multiple,UseSynchronizationContext=false)] 4 public class SendMessage:ISendMessage 5 { 6 private System.Timers.Timer _setValueTimer; 7 private IMessageCallbackContract callerProxy = null; 8 ~SendMessage() 9 { 10 _setValueTimer.Stop(); 11 Device.OnChange -= new Action(Student_OnChange); 12 } 13 public SendMessage() 14 { 15 Thread.Sleep(3000); 16 _setValueTimer = new System.Timers.Timer(); 17 _setValueTimer.AutoReset = true; 18 _setValueTimer.Elapsed += Timer_Elapsed; 19 _setValueTimer.Interval = 10000; 20 _setValueTimer.Start(); 21 Device.OnChange += new Action(Student_OnChange); 22 } 23 //保存客户端回调的实例 24 public void Subscribe() 25 { 26 try 27 { 28 //获取当前调用的核心服务端实例的通道 29 callerProxy = OperationContext.Current.GetCallbackChannel(); 30 } 31 catch (Exception ex) 32 { 33 throw new FaultException(ex.Message); 34 } 35 } 36 private void Timer_Elapsed(object sender, ElapsedEventArgs e) 37 { 38 Random rand = new Random(); 39 string name = "路由器"+rand.Next(10); 40 SetName(name); 41 } 42 private void SetName(string greeting) 43 { 44 if (greeting != Device.Name) 45 { 46 Device.Name = greeting; 47 Device.Change(greeting); 48 } 49 } 50 void Student_OnChange(string name) 51 { 52 try 53 { 54 Console.Write("只要名字与当前的不同就向客户端推送通知\r\n"); 55 callerProxy.ReportMes(name); 56 } 57 catch (Exception ex) 58 { 59 Console.Write(ex.Message); 60 } 61 } 62 } 63 //创建设备类 64 public static class Device 65 { 66 public static string Name { get; set; } 67 public static event Action OnChange; 68 public static void Change(string name) 69 { 70 if (OnChange != null) 71 { 72 OnChange.Invoke(name); 73 } 74 } 75 } 76 }