/// <summary> /// Control with Callback, connects to the end point address and waits for notifications. /// See also http://www.codeproject.com/Articles/39143/C-WCF-Client-Server-without-HTTP-with-Callbacks-Ma /// </summary> /// <param name="endPointAddress">Server end point address.</param> /// <param name="adr">Zone Address to monitor.</param> private static void ControlWithCallback(EndpointAddress endPointAddress, Address adr) { Console.WriteLine(">>> Setup M&C server ..."); ILog _log = LogManager.GetCurrentClassLogger(); IMonitorAndControl pipeProxy = null; IMonitorAndControlNotification serverCallback = new ServerCallback(); try { int port = FindPort(); var binding = new WSDualHttpBinding("WSDualHttpBinding_IMonitorAndControl"); binding.ClientBaseAddress = new Uri("http://" + NetworkHelper.getHostName() + ":" + port + "/"); /*note the "DuplexChannelFactory". This is necessary for Callbacks. * A regular "ChannelFactory" won't work with callbacks.*/ DuplexChannelFactory <IMonitorAndControl> pipeFactory = new DuplexChannelFactory <IMonitorAndControl>( new InstanceContext(serverCallback), binding, endPointAddress); try { Console.WriteLine(">>> creating channel to {0} with callback address {1}", endPointAddress.Uri.ToString(), binding.ClientBaseAddress.ToString()); //Open the channel to the server pipeProxy = pipeFactory.CreateChannel(); pipeProxy.Connect(); // Get zone status pipeProxy.Monitor(adr); // Listen to changes ... int iSecTimeout = 60; Console.WriteLine(">>> Wait {0} seconds, and listen to notifications!", iSecTimeout); System.Threading.Thread.Sleep(iSecTimeout * 1000); Console.WriteLine(">>> Stop listening ...."); pipeProxy.RemoveMonitor(adr); } catch (Exception e) { Console.WriteLine("ControlWithCallback - Exception: {0}", e.Message); _log.Fatal(m => m("ControlWithCallback - Exception: {0}", e.Message)); } } catch (FaultException <ArgumentException> exc) { Console.WriteLine("ControlWithCallback - FaultException: {0}", exc); _log.Fatal(m => m("ControlWithCallback - FaultException: {0}", exc)); } catch (Exception exc) { Console.WriteLine("ControlWithCallback - Exception: {0}", exc); _log.Fatal(m => m("ControlWithCallback - Exception: {0}", exc)); } }
/// <summary> /// Removes a monitor for a zone. (Unubscribes for zone state changes.) /// </summary> /// <param name="zoneId">Address of the zone.</param> /// <param name="subscriber">The subscriber.</param> public void RemoveMonitor(Address zoneId, ZoneNotification subscriber) { _log.Trace(m => m(String.Format("M&C Proxy; RemoveMonitor(); Address: {0}", zoneId))); try { if (_zoneSubscriptions.ContainsKey(zoneId) == false) { return; } if (_zoneSubscriptions[zoneId].RemoveSubscriber(subscriber) == 0) { _mcServiceProxy.RemoveMonitor(zoneId); _zoneSubscriptions.Remove(zoneId); } } catch (Exception exc) { _log.Warn("Failed to unsubscribe for the zone.", exc); } }