using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Windows.Forms; using EAS.Distributed; using System.ServiceModel.Channels; using System.ServiceModel; namespace EAS.Distributed { class XUpdate { string allowUpdate = "0"; string url = string.Empty; string m_Application = "EAS.WinClient.Start.exe"; string smartConfigFile = string.Empty; string m_Title = "天瑞体检自动更新程序"; string m_StartPath = string.Empty; IUpdateService service = null; #region 单例模式 static XUpdate instance = new XUpdate(); static readonly object _lock = new object(); /// /// 单例。 /// public static XUpdate Instance { get { lock (_lock) { if (instance == null) { instance = new XUpdate(); } } return instance; } } internal XUpdate() { string file = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "update.ini"); IniFile iniFile = new IniFile(file); //1.基本参数 try { this.allowUpdate = iniFile.ReadValue("config", "allow"); } catch { this.allowUpdate = "0"; } try { this.url = iniFile.ReadValue("config", "url"); } catch { this.url = string.Empty; } this.WorkDirectory = System.Windows.Forms.Application.StartupPath; //2.是否读配置文件中的启动文件。 try { this.m_Application = iniFile.ReadValue("config", "application"); } catch { } //包括路径。 this.m_Application = Path.Combine(this.WorkDirectory, this.m_Application); try { this.m_Title = iniFile.ReadValue("config", "title"); } catch { } } #endregion public IUpdateService Service { get { return service; } } /// /// 充许升级。 /// public bool AllowUpdate { get { return this.allowUpdate =="1"; } set { this.allowUpdate = value ? "1" :"0"; } } /// /// 智能服务地址。 /// public string Url { get { return this.url; } set { this.url = value; } } /// /// 主界面标题。 /// public string Title { get { return this.m_Title; } set { this.m_Title = value; } } /// /// 工作目录。 /// public string WorkDirectory { get; set; } /// /// 主程序名称(EXE)。 /// public string Application { get { return this.m_Application; } set { this.m_Application = value; } } /// /// 应用基础目录。 /// /// public string GetBaseDirectory() { if (this.WorkDirectory.Length > 0) return this.WorkDirectory; else { return AppDomain.CurrentDomain.BaseDirectory; } } /// /// 升级临时目录。 /// /// public string GetDownDirectory() { return Path.Combine(GetBaseDirectory(), "t-update"); } internal static void GetService() { string url = Instance.url.ToLower(); //兼容旧版本升级程序 2012/04/24 url = url.Replace("eas.smartupdateservice", "eas.updateservice"); Instance.service = CreateUpdateService(url); } static IUpdateService CreateUpdateService(string url) { System.ServiceModel.Channels.Binding binding = null; string url2 = url.ToLower(); if (url2.StartsWith("net.tcp://")) { NetTcpBinding netTcpBinding = new NetTcpBinding(); binding = netTcpBinding; netTcpBinding.MaxReceivedMessageSize = 64 * 1024 * 1024; netTcpBinding.ReaderQuotas.MaxStringContentLength = 64 * 1024 * 1024; netTcpBinding.ReaderQuotas.MaxArrayLength = 64 * 1024 * 1024; netTcpBinding.Security.Mode = SecurityMode.None; } else if (url2.StartsWith("http://")) { if (url2.EndsWith(".asmx")) //.net2.0ws { return new Service_Proxy(url2); } else { BasicHttpBinding basicHttpBinding = new BasicHttpBinding(); binding = basicHttpBinding; basicHttpBinding.MaxReceivedMessageSize = 64 * 1024 * 1024; basicHttpBinding.ReaderQuotas.MaxStringContentLength = 64 * 1024 * 1024; basicHttpBinding.ReaderQuotas.MaxArrayLength = 64 * 1024 * 1024; basicHttpBinding.Security.Mode = BasicHttpSecurityMode.None; } } else if (url2.StartsWith("net.msmq://")) { NetMsmqBinding netMsmqBinding = new NetMsmqBinding(); binding = netMsmqBinding; netMsmqBinding.MaxReceivedMessageSize = 64 * 1024 * 1024; netMsmqBinding.ReaderQuotas.MaxStringContentLength = 64 * 1024 * 1024; netMsmqBinding.ReaderQuotas.MaxArrayLength = 64 * 1024 * 1024; netMsmqBinding.Security.Mode = NetMsmqSecurityMode.None; } else if (url2.StartsWith("net.p2p://")) { NetMsmqBinding netPeerTcpBinding = new NetMsmqBinding(); binding = netPeerTcpBinding; netPeerTcpBinding.MaxReceivedMessageSize = 64 * 1024 * 1024; netPeerTcpBinding.ReaderQuotas.MaxStringContentLength = 64 * 1024 * 1024; netPeerTcpBinding.ReaderQuotas.MaxArrayLength = 64 * 1024 * 1024; netPeerTcpBinding.Security.Mode = NetMsmqSecurityMode.None; } else throw new System.Exception("不是一个有效的升级服务地址"); ChannelFactory cf = new ChannelFactory(binding, url2); return cf.CreateChannel(); } internal static SmartConfig LoadSmartAssemblyList() { return SmartConfig.Load(Path.Combine(XUpdate.Instance.GetBaseDirectory(), SmartConfig.DefaultConfgiFile)); } } }