微信开发 企业号(三)– 主动调用(通讯录、多媒体文件、自定义菜单,下发信息) – CosmoKey

已完成通讯录、多媒体文件、自定义菜单,下发信息接口代码

代码结构

结构及父类CodeMap

QrY3Qv

zERj6n

获取Token

通过企业ID及管理员组I的获取Token

string strulr = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}";string corpID = "wx企业ID"; //企业IDstring Secret = "管理员组ID";//管理员组IDHttpHelper 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;
}
}
}

HttpHelper类

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

 附上代码(仅通过测试,并未对异常处理)

本文由 微营销手册 作者:微营销手册 发表,其版权均为 微营销手册 所有,文章内容系作者个人观点,不代表 微营销手册 对观点赞同或支持。如需转载,请注明文章来源。
10

发表评论