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
}
}