[ServiceContract(CallbackContract = typeof(IUpdateServiceCallback))] public interface IUpdaterService { #region Callback subsctibe/unsibscribe methods [OperationContract(IsOneWay = true)] void Subscribe(SubscribeRequest request); [OperationContract(IsOneWay = true)] void Unsubscribe(UnsubscribeRequest request); #endregion [OperationContract(IsOneWay = true)] void InstallAvalibleUpdates(InstallAvalibleUpdatesRequst request); [OperationContract(IsOneWay = true)] void DownloadUpdate(Guid applicationId); [OperationContract(IsOneWay = true)] void CheckForUpdates(Guid applicationId); } [ServiceContract] public interface IUpdateServiceCallback { [OperationContract(IsOneWay = true)] void OnUpdateDetected(UpdateDetectedEventArgs eventArgs); [OperationContract(IsOneWay = true)] void OnUpdateDownloaded(UpdateDownloadedEventArgs updateDetectedEventArgs); [OperationContract(IsOneWay = true)] void OnUpdateInstalled(UpdateInstalledEventArgs eventArgs); }
public void Subscribe(SubscribeRequest request) { // calback IUpdateServiceCallback callback = OperationContext.Current.GetCallbackChannel<IUpdateServiceCallback>(); // lock, lock (sync) { // Application ID. , // . / var app = applicationService.Get(request.ApplicationId); if (app == null) { app = new Application() { Id = request.ApplicationId }; applicationService.Add(app); } app.CurrentVersion = request.Version ?? app.CurrentVersion; app.RootFolderPath = request.RootFolder ?? app.RootFolderPath; app.Name = request.ApplicationName ?? app.Name; } // callback' , // var list = GetEventList(request.ApplicationId) ?? new CallbacksList(); list.OnUpdateDetected += callback.OnUpdateDetected; list.OnUpdateDownloaded += callback.OnUpdateDownloaded; if (registredCallbacks.ContainsKey(request.ApplicationId)) { registredCallbacks[request.ApplicationId] = list; } else { registredCallbacks.Add(request.ApplicationId, list); } // , // ( // ) ICommunicationObject obj = (ICommunicationObject)callback; obj.Closing += ClientClosing; obj.Closed += ClientClosed; applicationService.SaveChanges(); }
private static Dictionary<Guid, CallbacksList> registredCallbacks; // callback' null private static CallbacksList GetEventList(Guid appId) { CallbacksList result; return registredCallbacks.TryGetValue(appId, out result) ? result : null; } // callback' private static void PerformCallback(Guid applicationId, Action<CallbacksList> func) { try { var list = GetEventList(applicationId); if (list != null) { func(list); } } catch { } } // OnUpdateDetected // ApplicatioId public static void OnUpdateDetected(UpdateDetectedEventArgs args) { PerformCallback(args.ApplicationId, callbacks => callbacks.OnUpdateDetected(args)); }
public class Application { public Guid Id { get; set; } public String Name { get; set; } public Version CurrentVersion { get; set; } public String RootFolderPath { get; set; } public List<Update> Updates { get; set; } } public class Update { public String UpdateUrl { get; set; } public Version Version { get; set; } public bool IsInstalled { get; set; } public bool IsDownloaded { get; set; } public string UpdateLocalPath { get; set; } }
public interface IUpdatble { Guid ApplicationId { get; } String ApplicationName { get; } String RootFolder { get; } } public class UpdaterClient { private IUpdaterService client; private IUpdateble settings; private DuplexChannelFactory<IUpdaterService> factory; public UpdaterClient(IUpdateServiceCallback callback, IUpdateble settings) { this.settings = settings; var context = new InstanceContext(callback); var binding = new NetTcpBinding(); // , // , // IUpdateServiceCallback factory = new DuplexChannelFactory<IUpdaterService>(context, binding, new EndpointAddress(UpdaterSettings.Default.UpdaterServiceUrl)); client = factory.CreateChannel(); } // , // Iupdateble , // public void Subscribe() { client.Subscribe(new SubscribeRequest() { ApplicationId = settings.ApplicationId, RootFolder = settings.RootFolder, Version = settings.Version, ApplicationName = settings.ApplicationName }); } public void Unsubscribe() { client.Unsubscribe(new UnsubscribeRequest() { ApplicationId = settings.ApplicationId }); } public void InstallUpdates(bool reopenOnComplete) { InstallUpdates(reopenOnComplete); } public void DownloadUpdate() { client.DownloadUpdate(new DownloadUpdateRequest() { ApplicationId = settings.ApplicationId }); } public void CheckForUpdates() { client.CheckForUpdates(settings.ApplicationId); } public void InstallUpdates(bool reopenOnComplete) { client.InstallAvalibleUpdates(new InstallAvalibleUpdatesRequst() { ApplicationId = settings.ApplicationId, RestartOnComplete = reopenOnComplete }); } }
Source: https://habr.com/ru/post/131649/