using System; using System.Collections.Generic; using System.Text; //using Curtain.WCF.Contract; namespace Curtain.WCF.Proxy { /// /// 服务代理配置 /// public class WCFProxySetting { #region 常量 private const string LOCALHOST = "localhost"; private const string IP127001 = "127.0.0.1"; /// /// 10天 /// public const double OPERATION_TIMEOUT_10D = 14400d; /// /// 20天 /// public const double OPERATION_TIMEOUT_MAX = 28800d; /// /// 默认配置 /// public const string DefaultSettingName = "Default"; #endregion #region 成员变量 private int _version = 1; private string _settingID = Guid.NewGuid().ToString("N"); private string _name = null; private string _serviceName = "WCFService"; private string _ip = LOCALHOST; private string _port = "8888"; private string _uri = "net.tcp://localhost:8888/WCFService"; private string _binding = "http://"; private string _suffix = ""; #endregion #region 默认配置 /// /// 默认配置 /// private static WCFProxySetting _defaultSetting = null; /// /// 默认配置 /// public static WCFProxySetting DefaultSetting { get { if (_defaultSetting == null) { _defaultSetting = new WCFProxySetting(DefaultSettingName); //_defaultSetting._settingID = DefaultSettingID; } return _defaultSetting; } } ///// ///// 默认认证消息 ///// //public static AuthInfo DefaultAuthInfo //{ // get // { // return DefaultSetting.AuthInfo; // } //} #endregion #region 属性 ///// ///// 配置ID ///// //public string SettingID //{ // get // { // return this._settingID; // } //} public string Name { get { return this._name; } } /// /// 配置版本 /// public int Version { get { return this._version; } } /// /// 服务名 /// public string ServiceName { get { return this._serviceName; } } /// /// IP /// public string IP { get { return this._ip; } } /// /// 端口 /// public string Port { get { return this._port; } } /// /// /// public string Binding { get { return this._binding; } set { this._binding = value; } } /// /// /// public string Suffix { get { return this._suffix; } set { this._suffix = value; } } /// /// URI /// public string Uri { get { return this._uri; } } /// /// 0:自动 1:直连 2:内网 3:外网 /// public int Type { get; set; } = 0; #endregion #region 构造 /// /// 服务代理配置 /// private WCFProxySetting() { this._name = this._settingID; } private WCFProxySetting(string name) { this._name = name; } /// /// 服务代理配置 /// /// /// /// private WCFProxySetting(string name, string ip, string port, string serviceName = null) { if (string.IsNullOrWhiteSpace(ip)) { throw new ArgumentNullException("ip"); } if (string.IsNullOrWhiteSpace(port)) { throw new ArgumentNullException("port"); } this._name = name; this._ip = ip; this._port = port; this._serviceName = serviceName; this.SetUri(); } /// /// 服务代理配置 /// /// /// /// public WCFProxySetting(string ip, string port, string serviceName = null) { if (string.IsNullOrWhiteSpace(ip)) { throw new ArgumentNullException("ip"); } if (string.IsNullOrWhiteSpace(port)) { throw new ArgumentNullException("port"); } this._name = this._settingID; this._ip = ip; this._port = port; this._serviceName = serviceName; this.SetUri(); } #endregion #region 公有方法 /// /// 获取终结点地址 /// /// /// 终结点地址 public string GetEndpointAddress(string endpointAddress) { if (string.IsNullOrWhiteSpace(endpointAddress)) { throw new ArgumentNullException("endpointAddress"); } if (string.IsNullOrWhiteSpace(this._ip)) { return string.Empty; } //StringBuilder uri = new StringBuilder(this._binding); //uri.Append(this._ip); //if (!string.IsNullOrWhiteSpace(this._port)) //{ // uri.Append(":"); // uri.Append(this._port); //} //uri.Append("/"); //if (!string.IsNullOrWhiteSpace(this._serviceName)) //{ // uri.Append(this._serviceName); // uri.Append("/"); //} StringBuilder uri = new StringBuilder(this._uri); if (!string.IsNullOrWhiteSpace(endpointAddress)) { if (!this._uri.EndsWith("/")) { uri.Append("/"); } uri.Append(endpointAddress); } uri.Append(this._suffix); return uri.ToString(); } /// /// 重设服务连接地址 /// /// /// /// public void ResetRemoteAddress(string ip, string port, string serviceName = null) { if (string.IsNullOrWhiteSpace(ip)) { throw new ArgumentNullException("ip"); } if (ip == IP127001 || ip == ".") { this._ip = LOCALHOST; } else { this._ip = ip; } this._port = port; this._serviceName = serviceName; this.SetUri(); this._version++; } #endregion #region 私有方法 /// /// 设置服务URI /// public void SetUri() { if (string.IsNullOrWhiteSpace(this._ip)) { this._uri = string.Empty; return; } StringBuilder uri = new StringBuilder(this._binding); uri.Append(this._ip); if (!string.IsNullOrWhiteSpace(this._port)) { uri.Append(":"); uri.Append(this._port); } uri.Append("/"); if (!string.IsNullOrWhiteSpace(this._serviceName)) { uri.Append(this._serviceName); } this._uri = uri.ToString(); } #endregion #region 消息头相关 /* /// /// 消息头名 /// public string MessageName { get; set; } /// /// 消息头命名空间 /// public string MessageNameSpace { get; set; } /// /// 消息头内容 /// public Parameters MessageValue { get; } */ ///// ///// 认证信息(非SOAP) ///// //public AuthInfo AuthInfo //{ // get; // set; //} #endregion #region 重写方法 public override int GetHashCode() { return base.GetHashCode(); } public static bool Equals(WCFProxySetting d, WCFProxySetting t) { if (d == null && t == null) { return true; } if (d == null) { return false; } if (t == null) { return false; } return d._settingID == t._settingID; } public override bool Equals(object o) { if (o is WCFProxySetting) { return Equals(this, o as WCFProxySetting); } return false; } //public static bool operator ==(ProxySettings d, ProxySettings t) //{ // return ProxySettings.Equals(d, t); //} //public static bool operator !=(ProxySettings d, ProxySettings t) //{ // return !ProxySettings.Equals(d, t); //} #endregion #region 配置管理 private static Dictionary Settings = new Dictionary(); /// /// 创建配置(name 为 null 或 "Default" 时 返回默认配置) /// /// /// public static WCFProxySetting CreateSetting(string name) { if (string.IsNullOrWhiteSpace(name) || DefaultSettingName == name) { return DefaultSetting; } if (Settings.ContainsKey(name)) { return Settings[name]; } WCFProxySetting setting = new WCFProxySetting(name); Settings.Add(name, setting); return setting; } /// /// 创建配置(name 为 null 或 "Default" 时 返回默认配置,但不修改ip、port、serviceName) /// /// /// public static WCFProxySetting CreateSetting(string name, string ip, string port, string serviceName = null) { if (string.IsNullOrWhiteSpace(name) || DefaultSettingName == name) { //WCFProxySetting s = DefaultSetting; //if (s.IP != ip || s.Port != port || s.ServiceName != serviceName) //{ // s.ResetRemoteAddress(ip, port, serviceName); //} //return s; return DefaultSetting; } if (Settings.ContainsKey(name)) { WCFProxySetting s = Settings[name]; if (s.IP != ip || s.Port != port || s.ServiceName != serviceName) { s.ResetRemoteAddress(ip, port, serviceName); } return s; } WCFProxySetting setting = new WCFProxySetting(name, ip, port, serviceName); Settings.Add(name, setting); return setting; } /// /// 判断配置是否存在(name 为 null 或 "Default" 时 返回默认配置) /// /// /// public static bool ContainsName(string name) { if (string.IsNullOrWhiteSpace(name) || DefaultSettingName == name) { return true; } return Settings.ContainsKey(name); } /// /// 获取配置(name 为 null 或 "Default" 时 返回默认配置) /// /// /// public static WCFProxySetting GetSetting(string name) { if (string.IsNullOrWhiteSpace(name) || DefaultSettingName == name) { return DefaultSetting; } if (Settings.ContainsKey(name)) { return Settings[name]; } return null; } /// /// 删除配置(name 为 null 或 "Default" 时 为默认配置,不能删除) /// /// /// public static bool RemoveSetting(string name) { if (string.IsNullOrWhiteSpace(name) || DefaultSettingName == name) { return false; } return Settings.Remove(name); } #endregion } }