private void AddWithSqlDependency(string key, TValue item, SqlCacheDependency sqlDependency) { if (key == null) { throw new ArgumentNullException(nameof(key)); } if (sqlDependency == null) { throw new ArgumentNullException(nameof(sqlDependency)); } _Cache.SetObject(key, new CacheItem <TValue>() { AbsoluteExpiration = DateTime.MinValue, SlidingExpiration = TimeSpan.Zero, Item = item }); Policy.Handle <Exception>() .RetryForever() .Execute(() => { // subscribe to sql dependency _channel = new ChangeTrackingChannelHelper((ISqlChangeCallback)this).OpenChannel(); _channel.Subscribe(key, sqlDependency.TableName); } ); // subscribe client for callback SubscribeCallback(key, sqlDependency.Callback); }
public override void OnStart() { // Will be called the first time windows service is started! Tasks = new List <Task>(); // Configure the DI and dependencies and intitialize the Manager Logger.Information("OnStart [S]" + DateTime.Now); var container = ConfigureDependency.Configure(); SimpleInjectorServiceHostFactory.SetContainer(container); Logger.Information("Configuring dependencies"); var changeTrackingManager = container.GetInstance <ISqlTrackingManager>(); changeTrackingManager.logger = this.Logger; Logger.Information("Initialsing the change tracking manager!"); cancellationTokenSource = new CancellationTokenSource(); Tasks.Add(changeTrackingManager.ProcessChangedTables(cancellationTokenSource.Token)); // Initialise wcf service host // Wcf Service Instance _WcfService = container.GetInstance <IChangeTrackingSubscriptions>(); _WcfService.Logger = this.Logger; _ServiceHost = WcfServiceHost.GetServiceHost(_WcfService); Logger.Information("OnStart [E]" + DateTime.Now); }
public IChangeTrackingSubscriptions OpenChannel() { var callbackCleint = new CallbackCleint(Callback); var client = new DuplexChannelFactoryClient <IChangeTrackingSubscriptions, IEventNotificationCallback> (callbackCleint, ServiceUrl.SqlTrackingWcfServiceAddress); _channel = client.CreateChannel(); ((ICommunicationObject)_channel).Closed += Channel_Closed; ((ICommunicationObject)_channel).Faulted += Channel_Faulted; return(_channel); }
public static ServiceHost GetServiceHost(IChangeTrackingSubscriptions service) { if (_ServiceHost != null) { _ServiceHost.Close(); } Uri[] adrbase = { new Uri(tcpBaseAddress) }; // initialize the WCF service using DI and inject it into hose _ServiceHost = new ServiceHost(service, adrbase); // NB: important be able to inject service instance above ((ServiceBehaviorAttribute)_ServiceHost.Description.Behaviors[typeof(ServiceBehaviorAttribute)]).InstanceContextMode = InstanceContextMode.Single; ServiceMetadataBehavior serviceBehaviour = new ServiceMetadataBehavior(); if (!_ServiceHost.Description.Behaviors.Contains(serviceBehaviour)) { _ServiceHost.Description.Behaviors.Add(serviceBehaviour); } NetTcpBinding tcpBinding = new NetTcpBinding(); // NB: important to keep the duplex session open for long, though should be some reasonable number? tcpBinding.OpenTimeout = TimeSpan.MaxValue; tcpBinding.CloseTimeout = TimeSpan.MaxValue; tcpBinding.ReceiveTimeout = TimeSpan.MaxValue; _ServiceHost.AddServiceEndpoint(typeof(IChangeTrackingSubscriptions), tcpBinding, tcpBaseAddress); _ServiceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex"); _ServiceHost.Open(); return(_ServiceHost); }
public SqlTrackingManager(IDatabaseHelper databaseHelper, IChangeTrackingSubscriptions wcfService) { DatabaseHelper = databaseHelper; WcfService = wcfService; }