已完成通訊錄、多媒體文件、自定義菜單,下發信息接口代碼
代碼結構
結構及父類CodeMap
UserGet接口的CodeMap
獲取Token
通過企業ID及管理員組I的獲取Token
string strulr = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}"; string corpID = "wx企業ID"; //企業ID string Secret = "管理員組ID";//管理員組ID HttpHelper http = new HttpHelper(); string respone = http.Get(string.Format(strulr, corpID, Secret), Encoding.UTF8); var token = JsonConvert.DeserializeObject<Token>(respone); Token._Token = token; return token;
返回的Token為
{"access_token":"NttjomfbHraVFAQTYg1NJ4fcP2dbJpnlnUH0TXT27MxxxxxxxxxxxxxxA","expires_in":7200}
expires_in為Token的有效時長,Token再調用接口時自動續期。
經過封裝后的Token類
public class Token { public static Token _Token; public string access_token { get; set; } public int expires_in { get; set; } private DateTime createTokenTime = DateTime.Now; /// <summary> /// 到期時間(防止時間差,提前1分鍾到期) /// </summary> /// <returns></returns> public DateTime TookenOverdueTime { get { return createTokenTime.AddSeconds(expires_in - 60); } } /// <summary> /// 刷新Token /// </summary> public static void Renovate() { if (_Token == null) { GetNewToken(); } Token._Token.createTokenTime = DateTime.Now; } public static bool IsTimeOut() { if (_Token == null) { GetNewToken(); } return DateTime.Now >= Token._Token.TookenOverdueTime; } public static Token GetNewToken() { string strulr = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}"; string corpID = "wx362a967b"; //企業ID string Secret = "e1OskLgJAScVSiFfWVK-0FfVz6svRVdEbR";//管理員組ID HttpHelper http = new HttpHelper(); string respone = http.Get(string.Format(strulr, corpID, Secret), Encoding.UTF8); var token = JsonConvert.DeserializeObject<Token>(respone); Token._Token = token; return token; } public static string GetToken() { if (_Token == null) { GetNewToken(); } return _Token.access_token; } }
Http請求
自己寫的而一個HttpHelper類,方便與Web服務器使用HTTP協議進行通信。

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading.Tasks; namespace Ping.Helper { public class HttpHelper { public bool Debug { get; set; } public CookieCollection Cookies { get { return _cookies; } } public void ClearCookies() { _cookies = new CookieCollection(); } CookieCollection _cookies = new CookieCollection(); private static readonly string DefaultUserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)"; /// <summary> /// 創建GET方式的HTTP請求 /// </summary> /// <param name="url">請求的URL</param> /// <param name="timeout">請求的超時時間</param> /// <param name="userAgent">請求的客戶端瀏覽器信息,可以為空</param> /// <param name="cookies">隨同HTTP請求發送的Cookie信息,如果不需要身份驗證可以為空</param> /// <returns></returns> public HttpWebResponse CreateGetHttpResponse(string url, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null) { if (Debug) { Console.Write("Start Get Url:{0} ", url); } if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } HttpWebRequest request; if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "GET"; request.Headers["Pragma"] = "no-cache"; request.Accept = "text/html, application/xhtml+xml, */*"; request.Headers["Accept-Language"] = "en-US,en;q=0.5"; request.ContentType = "application/x-www-form-urlencoded"; request.UserAgent = DefaultUserAgent; request.Referer = Referer; if (headers != null) { foreach (var header in headers) { request.Headers.Add(header.Key, header.Value); } } if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value * 1000; } if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } else { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(Cookies); } var v = request.GetResponse() as HttpWebResponse; Cookies.Add(request.CookieContainer.GetCookies(new Uri("http://" + new Uri(url).Host))); Cookies.Add(request.CookieContainer.GetCookies(new Uri("https://" + new Uri(url).Host))); Cookies.Add(v.Cookies); if (Debug) { Console.WriteLine("OK"); } return v; } /// <summary> /// 創建POST方式的HTTP請求 /// </summary> /// <param name="url">請求的URL</param> /// <param name="parameters">隨同請求POST的參數名稱及參數值字典</param> /// <param name="timeout">請求的超時時間</param> /// <param name="userAgent">請求的客戶端瀏覽器信息,可以為空</param> /// <param name="requestEncoding">發送HTTP請求時所用的編碼</param> /// <param name="cookies">隨同HTTP請求發送的Cookie信息,如果不需要身份驗證可以為空</param> /// <returns></returns> public HttpWebResponse CreatePostHttpResponse(string url, IDictionary<string, string> parameters, Encoding requestEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null) { if (Debug) { Console.Write("Start Post Url:{0} ", url); foreach (KeyValuePair<string, string> keyValuePair in parameters) { Console.Write(",{0}:{1}", keyValuePair.Key, keyValuePair.Value); } } if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } if (requestEncoding == null) { throw new ArgumentNullException("requestEncoding"); } HttpWebRequest request = null; //如果是發送HTTPS請求 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "POST"; request.Accept = "text/html, application/xhtml+xml, application/json, text/javascript, */*; q=0.01"; request.Referer = Referer; request.Headers["Accept-Language"] = "en-US,en;q=0.5"; request.UserAgent = DefaultUserAgent; request.ContentType = "application/x-www-form-urlencoded"; request.Headers["Pragma"] = "no-cache"; if (headers != null) { foreach (var header in headers) { request.Headers.Add(header.Key, header.Value); } } if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } else { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(Cookies); } if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } else { request.UserAgent = DefaultUserAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value * 1000; } request.Expect = string.Empty; //如果需要POST數據 if (!(parameters == null || parameters.Count == 0)) { var buffer = CraeteParameter(parameters); byte[] data = requestEncoding.GetBytes(buffer.ToString()); using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } } var v = request.GetResponse() as HttpWebResponse; Cookies.Add(request.CookieContainer.GetCookies(new Uri("http://" + new Uri(url).Host))); Cookies.Add(request.CookieContainer.GetCookies(new Uri("https://" + new Uri(url).Host))); Cookies.Add(v.Cookies); if (Debug) { Console.WriteLine("OK"); } return v; } /// <summary> /// 創建POST方式的HTTP請求 /// </summary> /// <param name="url">請求的URL</param> /// <param name="parameters">隨同請求POST的參數名稱及參數值字典</param> /// <param name="timeout">請求的超時時間</param> /// <param name="userAgent">請求的客戶端瀏覽器信息,可以為空</param> /// <param name="requestEncoding">發送HTTP請求時所用的編碼</param> /// <param name="cookies">隨同HTTP請求發送的Cookie信息,如果不需要身份驗證可以為空</param> /// <returns></returns> public HttpWebResponse CreatePostHttpResponse(string url, string parameters, Encoding requestEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null) { if (Debug) { Console.Write("Start Post Url:{0} ,parameters:{1} ", url, parameters); } if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } if (requestEncoding == null) { throw new ArgumentNullException("requestEncoding"); } HttpWebRequest request = null; //如果是發送HTTPS請求 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "POST"; request.Headers.Add("Accept-Language", "zh-CN,en-GB;q=0.5"); request.Method = "POST"; request.Accept = "text/html, application/xhtml+xml, */*"; request.Referer = Referer; request.Headers["Accept-Language"] = "en-US,en;q=0.5"; request.UserAgent = DefaultUserAgent; request.ContentType = "application/x-www-form-urlencoded"; request.Headers["Pragma"] = "no-cache"; if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } else { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(Cookies); } if (headers != null) { foreach (var header in headers) { request.Headers.Add(header.Key, header.Value); } } if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } else { request.UserAgent = DefaultUserAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value * 1000; } request.Expect = string.Empty; //如果需要POST數據 if (!string.IsNullOrEmpty(parameters)) { byte[] data = requestEncoding.GetBytes(parameters); using (Stream stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } } var v = request.GetResponse() as HttpWebResponse; Cookies.Add(request.CookieContainer.GetCookies(new Uri("http://" + new Uri(url).Host))); Cookies.Add(request.CookieContainer.GetCookies(new Uri("https://" + new Uri(url).Host))); Cookies.Add(v.Cookies); if (Debug) { Console.WriteLine("OK"); } return v; } /// <summary> /// 創建POST方式的HTTP請求 /// </summary> /// <param name="url">請求的URL</param> /// <param name="parameters">隨同請求POST的參數名稱及參數值字典</param> /// <param name="timeout">請求的超時時間</param> /// <param name="userAgent">請求的客戶端瀏覽器信息,可以為空</param> /// <param name="requestEncoding">發送HTTP請求時所用的編碼</param> /// <param name="cookies">隨同HTTP請求發送的Cookie信息,如果不需要身份驗證可以為空</param> /// <returns></returns> public HttpWebResponse CreatePostFileHttpResponse(string url, string filePath, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null) { if (Debug) { Console.Write("Start Post Url:{0} ", url); } if (string.IsNullOrEmpty(url)) { throw new ArgumentNullException("url"); } HttpWebRequest request = null; //如果是發送HTTPS請求 if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase)) { ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult); request = WebRequest.Create(url) as HttpWebRequest; request.ProtocolVersion = HttpVersion.Version10; } else { request = WebRequest.Create(url) as HttpWebRequest; } request.Method = "POST"; request.Accept = "text/html, application/xhtml+xml, application/json, text/javascript, */*; q=0.01"; request.Referer = Referer; request.Headers["Accept-Language"] = "en-US,en;q=0.5"; request.UserAgent = DefaultUserAgent; request.ContentType = "application/x-www-form-urlencoded"; request.Headers["Pragma"] = "no-cache"; if (headers != null) { foreach (var header in headers) { request.Headers.Add(header.Key, header.Value); } } if (cookies != null) { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(cookies); } else { request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(Cookies); } if (!string.IsNullOrEmpty(userAgent)) { request.UserAgent = userAgent; } else { request.UserAgent = DefaultUserAgent; } if (timeout.HasValue) { request.Timeout = timeout.Value * 1000; } request.Expect = string.Empty; //如果需要POST數據 if (!string.IsNullOrEmpty(filePath)) { using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { BinaryReader r = new BinaryReader(fs); //時間戳 string strBoundary = "----------" + DateTime.Now.Ticks.ToString("x"); byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + strBoundary + "\r\n"); //請求頭部信息 StringBuilder sb = new StringBuilder(); sb.Append("--"); sb.Append(strBoundary); sb.Append("\r\n"); sb.Append("Content-Disposition: form-data; name=\""); sb.Append("file"); sb.Append("\"; filename=\""); sb.Append(fs.Name); sb.Append("\""); sb.Append("\r\n"); sb.Append("Content-Type: "); sb.Append("application/octet-stream"); sb.Append("\r\n"); sb.Append("\r\n"); string strPostHeader = sb.ToString(); byte[] postHeaderBytes = Encoding.UTF8.GetBytes(strPostHeader); request.ContentType = "multipart/form-data; boundary=" + strBoundary; long length = fs.Length + postHeaderBytes.Length + boundaryBytes.Length; request.ContentLength = length; //開始上傳時間 DateTime startTime = DateTime.Now; byte[] filecontent = new byte[fs.Length]; fs.Read(filecontent, 0, filecontent.Length); using (Stream stream = request.GetRequestStream()) { //發送請求頭部消息 stream.Write(postHeaderBytes, 0, postHeaderBytes.Length); stream.Write(filecontent, 0, filecontent.Length); //添加尾部的時間戳 stream.Write(boundaryBytes, 0, boundaryBytes.Length); } } } var v = request.GetResponse() as HttpWebResponse; Cookies.Add(request.CookieContainer.GetCookies(new Uri("http://" + new Uri(url).Host))); Cookies.Add(request.CookieContainer.GetCookies(new Uri("https://" + new Uri(url).Host))); Cookies.Add(v.Cookies); if (Debug) { Console.WriteLine("OK"); } return v; } public static string CraeteParameter(IDictionary<string, string> parameters) { StringBuilder buffer = new StringBuilder(); foreach (string key in parameters.Keys) { buffer.AppendFormat("&{0}={1}", key, parameters[key]); } return buffer.ToString().TrimStart('&'); } private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; //總是接受 } public string Post(string url, IDictionary<string, string> parameters, Encoding requestEncoding, Encoding responseEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null) { HttpWebResponse response = CreatePostHttpResponse(url, parameters, requestEncoding, timeout, userAgent, cookies, Referer, headers); try { using (StreamReader reader = new StreamReader(response.GetResponseStream(), responseEncoding)) { return reader.ReadToEnd(); } } catch (Exception) { return null; } } public string Post(string url, string parameters, Encoding requestEncoding, Encoding responseEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null) { HttpWebResponse response = CreatePostHttpResponse(url, parameters, requestEncoding, timeout, userAgent, cookies, Referer, headers); try { using (StreamReader reader = new StreamReader(response.GetResponseStream(), responseEncoding)) { return reader.ReadToEnd(); } } catch (Exception) { return null; } } public string PostFile(string url, string filePath, Encoding responseEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null) { HttpWebResponse response = CreatePostFileHttpResponse(url, filePath, timeout, userAgent, cookies, Referer, headers); try { using (StreamReader reader = new StreamReader(response.GetResponseStream(), responseEncoding)) { return reader.ReadToEnd(); } } catch (Exception) { return null; } } public string Get(string url, Encoding responseEncoding, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null) { HttpWebResponse response = CreateGetHttpResponse(url, timeout, userAgent, cookies, Referer, headers); try { using (StreamReader reader = new StreamReader(response.GetResponseStream(), responseEncoding)) { return reader.ReadToEnd(); } } catch (Exception) { return null; } } public byte[] GetFile(string url, out Dictionary<string, string> header, int? timeout = 300, string userAgent = "", CookieCollection cookies = null, string Referer = "", Dictionary<string, string> headers = null) { HttpWebResponse response = CreateGetHttpResponse(url, timeout, userAgent, cookies, Referer, headers); header = new Dictionary<string, string>(); foreach (string key in response.Headers.AllKeys) { header.Add(key, response.Headers[key]); } try { System.IO.Stream st = response.GetResponseStream(); byte[] by = new byte[response.ContentLength]; st.Read(by, 0, by.Length); st.Close(); return by; } catch (Exception) { return null; } return null; } } }
IHttpSend接口聲明,抽象出同一交互接口
public interface IHttpSend { string Send(string url, string data); }
代碼中Http請求分為4中:普通Get請求,普通Post請求,Post文件上傳請求,Get文件下載請求
並且不同請求中,Send方法第二個參數Data包含內容不同
//普通Get請求 public class HttpGetRequest : IHttpSend { public string Send(string url, string data) { return new HttpHelper().Get(url, Encoding.UTF8); } } //普通Post請求 public class HttpPostRequest : IHttpSend { public string Send(string url, string data) { return new HttpHelper().Post(url, data, Encoding.UTF8, Encoding.UTF8); } }
//Post文件上傳請求 class HttpPostFileRequest : IHttpSend { public string Send(string url, string data) { return new HttpHelper().PostFile(url, data,Encoding.UTF8); } } //Get文件下載請求 class HttpGetFileRequest : IHttpSend { public string Send(string url, string path) { Dictionary<string, string> header; var bytes = new HttpHelper().GetFile(url, out header); if (header["Content-Type"].Contains("application/json")) { return Encoding.UTF8.GetString(bytes); } else { Regex regImg = new Regex("\"(?<fileName>.*)\"", RegexOptions.IgnoreCase); MatchCollection matches = regImg.Matches(header["Content-disposition"]); string fileName = matches[0].Groups["fileName"].Value; string filepath = path.TrimEnd('\\') + "\\" + fileName; System.IO.Stream so = new System.IO.FileStream(filepath, System.IO.FileMode.Create); so.Write(bytes, 0, bytes.Length); so.Close(); } return JsonConvert.SerializeObject(header); } }
與微信交互
構建微信返回結果基類
public class OperationResultsBase { public int errcode { get; set; } public string errmsg { get; set; } }
構建統一發送接口,並使用協變,方便構造統一隊列
public interface ISend<out T> where T : OperationResultsBase, new() { T Send(); }
構建微信發送基類
public abstract class OperationRequestBase<T, THttp> : ISend<T> where T : OperationResultsBase, new() where THttp : IHttpSend, new() { protected abstract string Url(); /// <summary> /// 視同attribute進行簡單校驗 /// </summary> /// <param name="message"></param> /// <returns></returns> private bool Verify(out string message) { message = ""; foreach (var pro in this.GetType().GetProperties()) { var v = pro.GetCustomAttributes(typeof(IVerifyAttribute), true); foreach (IVerifyAttribute verify in pro.GetCustomAttributes(typeof(IVerifyAttribute), true)) { if (!verify.Verify(pro.PropertyType, pro.GetValue(this), out message)) { return false; } } } return true; } /// <summary> /// 格式化URL,替換Token /// </summary> /// <returns></returns> protected string GetUrl() { if (Token.IsTimeOut()) { Token.GetNewToken(); } string url = Url(); if (url.Contains("=ACCESS_TOKEN")) { url = url.Replace("=ACCESS_TOKEN", "=" + Token.GetToken()); } return url; } /// <summary> /// 發送 /// </summary> /// <returns></returns> public T Send() { string message = ""; if (!Verify(out message)) { throw new Exception(message); } //string result = new HttpHelper().Post(url, JsonConvert.SerializeObject(this), Encoding.UTF8, Encoding.UTF8); IHttpSend httpSend = new THttp(); string result = HttpSend(httpSend, GetUrl()); return GetDeserializeObject(result); } /// <summary> /// 處理返回結果 /// </summary> /// <param name="result"></param> /// <returns></returns> protected virtual T GetDeserializeObject(string result) { return JsonConvert.DeserializeObject<T>(result); } /// <summary> /// 處理發送請求 /// </summary> /// <param name="httpSend"></param> /// <param name="url"></param> /// <returns></returns> protected virtual string HttpSend(IHttpSend httpSend, string url) { return httpSend.Send(url, JsonConvert.SerializeObject(this)); } }
基類構造好,后續大部分開發就非常簡單了,
需要先構建結果類(如果無特殊字段,可直接使用OperationResultsBase)
構建請求類,繼承OperationRequestBase<>類,選擇結果類,及發送方式,再構造URL,最后填入所需字段即可
如:開發“部門列表數據"接口
//先構造返回類 public class DepartmentListResult :OperationResultsBase { /// <summary> /// 部門列表數據。以部門的order字段從小到大排列 /// </summary> /// <returns></returns> public List<DepartmentItem> department { get; set; } public class DepartmentItem { /// <summary> /// 部門id /// </summary> /// <returns></returns> public string id { get; set; } /// <summary> /// 部門名稱 /// </summary> /// <returns></returns> public string name { get; set; } /// <summary> /// 父親部門id。根部門為1 /// </summary> /// <returns></returns> public string parentid { get; set; } } } //再構造請求類 public class DepartmentList : OperationRequestBase<DepartmentListResult,HttpPostRequest> { protected override string Url() { return "https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=ACCESS_TOKEN"; } }
如:開發“創建部門"接口
//返回值類 無 //請求類 /// <summary> /// 創建部門 /// </summary> public class DepartmentCreate : OperationRequestBase<OperationResultsBase,HttpPostRequest> { protected override string Url() { return "https://qyapi.weixin.qq.com/cgi-bin/department/create?access_token=ACCESS_TOKEN"; } /// <summary> /// 部門名稱。長度限制為1~64個字符 /// </summary> /// <returns></returns> [Length(1,64)] [IsNotNull] public string name { get; set; } /// <summary> /// 父親部門id。根部門id為1 /// </summary> /// <returns></returns> [IsNotNull] public string parentid { get; set; } /// <summary> /// 在父部門中的次序。從1開始,數字越大排序越靠后 /// </summary> /// <returns></returns> public string order { get; set; } }
驗證
最后在加入加單驗證機制,如不為空驗證,長度限制
public interface IVerifyAttribute { bool Verify(Type type, object obj,out string message); } public class IsNotNullAttribute : Attribute, IVerifyAttribute { bool IsNotNull { get; set; } string Message { get; set; } public IsNotNullAttribute() { IsNotNull = true; Message = "不能為空"; } public IsNotNullAttribute(bool isNotNull) { IsNotNull = isNotNull; Message = "不能為空"; } public IsNotNullAttribute(bool isNull, string message) { IsNotNull = isNull; Message = message; } public bool Verify(Type type, object obj, out string message) { message = ""; if (IsNotNull == false) { return true; } if (obj == null) { message = Message; return false; } if (obj is IList) { if ((obj as IList).Count <= 0) { message = Message; return false; } } return true; } } public class LengthAttribute : Attribute, IVerifyAttribute { int MinLength { get; set; } int MaxLength { get; set; } string Message { get; set; } public LengthAttribute(int minLength, int maxLength) { MinLength = minLength; MaxLength = maxLength; Message = string.Format("字符串長度應在{0}到{1}之間",minLength,maxLength); } public LengthAttribute(int minLength, int maxLength,string message) { MinLength = minLength; MaxLength = maxLength; Message = string.Format(message, minLength, maxLength); } public bool Verify(Type type,object obj,out string message) { message = ""; if (type == typeof(string) && obj != null) { if ((obj as string).Length > MaxLength || (obj as string).Length < MinLength) { message = Message; return false; } } return true; } }