/// <summary> /// 发起待办 /// </summary> /// <param name="userid"></param> /// <param name="title"></param> /// <param name="url"></param> /// <param name="formItemList"></param> /// <param name="time"></param> /// <returns></returns> public ApiResult <String> WorkRecordAdd(String userid, String title, String url, List <Models.FormItemVo> formItemList, Int64 time = 0) { var res = GetResponseFromAsyncTask(CallAsync <WorkRecordAddRequest, WorkRecordAddResponse>("workrecord_add", new WorkRecordAddRequest() { userid = userid, title = title, url = url, formItemList = formItemList, create_time = time > 0 ? time : DateTools.GetUnix() * 1000, access_token = string.IsNullOrEmpty(this.SuiteTicket) ? GetToken() : GetCorpToken() }, System.Net.Http.HttpMethod.Get)); var rlt = new ApiResult <String> { message = res.message }; if (res.success && res.data != null) { if (res.data.errcode != 0) { rlt.code = res.data.errcode.ToString(); rlt.message = res.data.errmsg; } else if (!string.IsNullOrEmpty(res.data.record_id)) { rlt.data = res.data.record_id; rlt.success = true; } } return(rlt); }
private static String CreateUrl(bool https, string host, string token, string controller, string action, List <KeyValuePair <String, String> > kvList) { var url = (https ? "https" : "http") + "://" + host + "/" + controller + "/" + action; #region 处理接口基本参数及签名 if (!string.IsNullOrEmpty(token)) { kvList.Add(new KeyValuePair <String, String>("timespan", DateTools.GetUnix().ToString())); kvList = kvList.OrderBy(o => o.Key).ToList(); var values = new System.Text.StringBuilder(); foreach (var kv in kvList) { if (!string.IsNullOrEmpty(kv.Key)) { values.Append(kv.Value); } } values.Append(token); kvList.Add(new KeyValuePair <String, String>("sig", Wlniao.Encryptor.Md5Encryptor32(values.ToString()))); } #endregion #region 拼接请求参数 foreach (var kv in kvList) { url += url.IndexOf('?') > 0 ? "&" : "?"; url += kv.Key + "=" + kv.Value; } #endregion log.Debug(url); return(url); }
public void Loger() { for (var i = 0; i < 10000; i++) { Wlniao.log.Topic("test", DateTools.GetUnix() + strUtil.CreateRndStrE(16)); } Assert.Pass(); //Assert.Pass(); }
/// <summary> /// 从连接池获取一个实例 /// </summary> /// <param name="host"></param> /// <param name="port"></param> /// <param name="TimeOutSeconds"></param> /// <returns></returns> public static WlnSocket GetSocket(String host, Int32 port, Int32 TimeOutSeconds = 10) { var now = DateTools.GetUnix(); var endpoint = new System.Net.IPEndPoint(strUtil.IsIP(host) ? System.Net.IPAddress.Parse(host) : new Net.Dns.DnsTool().GetIPAddressDefault(host), port); lock (sockets) { try { beginCheck: foreach (var socket in sockets.OrderBy(a => a.LastUse)) { if (socket.LastUse < now - 30 && socket.Connected) { try { socket.Shutdown(System.Net.Sockets.SocketShutdown.Both); } catch { } } if (socket.RemoteEndPoint.ToString() == endpoint.ToString() && !socket.Using && socket.Connected && socket.LastUse < now - 3) { socket.Using = true; socket.LastUse = now; return(socket); } if (!socket.Connected) { sockets.Remove(socket); try { socket.IOControl(System.Net.Sockets.IOControlCode.KeepAliveValues, BitConverter.GetBytes(30), null); } catch { } socket.Dispose(); goto beginCheck; } } var newsocket = new WlnSocket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp); newsocket.Using = true; newsocket.LastUse = now; newsocket.Connect(endpoint); newsocket.SendTimeout = TimeOutSeconds * 1000; //10s newsocket.ReceiveTimeout = TimeOutSeconds * 1000; //10s sockets.Add(newsocket); return(newsocket); } catch { return(null); } } }
/// <summary> /// 根据手机号生成Sid /// </summary> /// <returns></returns> public static String Get(String Mobile) { if (strUtil.IsMobile(Mobile)) { var _rlt = Wlniao.OpenApi.Common.Get <String>("sid", "get", new KeyValuePair <string, string>("mobile", Mobile)); if (_rlt.success) { return(_rlt.data); } else { var r = new Random(); var ts = cvt.ToHex(DateTools.GetUnix(), "0123456789abcdef"); var ms = cvt.ToHex(long.Parse("86" + Mobile), "0123456789abcdef"); var v1 = cvt.ToHex(r.Next(4096, 26214), "0123456789abcdef"); var v2 = cvt.ToHex(r.Next(26214, 43690), "0123456789abcdef"); var v3 = cvt.ToHex(r.Next(43690, 65535), "0123456789abcdef"); return(ts + "-" + v1 + "-" + v2 + "-" + v3 + "-" + ms); } } return(System.Guid.NewGuid().ToString()); }
private static String RequestGet(String url) { var str = ""; try { if (url.StartsWith("https://")) { #region HTTPS请求 var uri = new Uri(url); var hostSocket = Wlniao.Net.WlnSocket.GetSocket(uri.Host, uri.Port); var reqStr = ""; reqStr += "GET " + uri.PathAndQuery + " HTTP/1.1"; reqStr += "\r\nHost: " + uri.Host; reqStr += "\r\nDate: " + DateTools.ConvertToGMT(DateTools.GetUnix()); reqStr += "\r\nAccept: application/json"; reqStr += "\r\n"; reqStr += "\r\n"; var request = System.Text.Encoding.UTF8.GetBytes(reqStr); using (var ssl = new System.Net.Security.SslStream(new System.Net.Sockets.NetworkStream(hostSocket, true), false, new System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate), null)) { ssl.AuthenticateAsClientAsync(uri.Host).ContinueWith((_rlt) => { if (ssl.IsAuthenticated) { ssl.Write(request); ssl.Flush(); var length = 0; var end = false; var start = false; var chunked = false; while (true) { var rev = new byte[65535]; var index = ssl.Read(rev, 0, rev.Length); if (index == 0) { break; } var beffur = new byte[index]; Buffer.BlockCopy(rev, 0, beffur, 0, index); var tempstr = strUtil.GetUTF8String(beffur); var lines = tempstr.Split(new string[] { "\r\n" }, StringSplitOptions.None); index = 0; #region Headers处理 if (!start && lines[0].StartsWith("HTTP")) { var ts = lines[0].Split(' '); if (ts[1] == "200") { for (index = 1; index < lines.Length; index++) { if (lines[index].ToLower().StartsWith("content-length")) { ts = lines[index].Split(' '); length = cvt.ToInt(ts[1]); } else if (lines[index].ToLower().StartsWith("transfer-encoding")) { chunked = lines[index].EndsWith("chunked"); } if (string.IsNullOrEmpty(lines[index])) { index++; start = true; break; } } } else { index = lines.Length; break; } } #endregion #region 取文本内容 for (; index < lines.Length; index++) { var line = lines[index]; if (chunked) { index++; if (index < lines.Length) { var tempLength = cvt.DeHex(line, "0123456789abcdef"); if (tempLength > 0) { length += (int)tempLength; line = lines[index]; } else if (lines.Length == index + 2 && string.IsNullOrEmpty(lines[index + 1])) { end = true; break; } else { break; } } else { break; } } if (index == 0 || (chunked && index == 1) || str.Length == 0) { str += line; } else { str += "\r\n" + line; } if (!chunked && System.Text.Encoding.UTF8.GetBytes(str).Length >= length) { end = true; } } if (end) { break; } #endregion } } }).Wait(); } hostSocket.Using = false; #endregion } else { #region HTTP请求 var response = new System.Net.Http.HttpClient().GetAsync(url).GetAwaiter().GetResult(); str = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); #endregion } if (string.IsNullOrEmpty(str)) { str = "{\"success\":false,\"message\":\"empty response\",\"data\":\"\"}"; } else { log.Info(str); } } catch (Exception ex) { str = "{\"success\":false,\"message\":\"request exception\",\"data\":\"" + ex.Message + "\"}"; } return(str); }
/// <summary> /// 发起Get请求 /// </summary> /// <param name="ApiHost"></param> /// <param name="ApiPath"></param> /// <param name="AppKey"></param> /// <param name="AppSecret"></param> /// <param name="kvs"></param> /// <returns></returns> public static ApiResult <String> GetString(String ApiHost, String ApiPath, String AppKey, String AppSecret, params KeyValuePair <String, String>[] kvs) { var rlt = new ApiResult <String>() { success = false, message = "", data = "" }; if (string.IsNullOrEmpty(AppKey)) { rlt.message = "云市场API应用AppKey未设置"; } else if (string.IsNullOrEmpty(AppSecret)) { rlt.message = "云市场API应用AppSecret未设置"; } else { using (var client = new System.Net.Http.HttpClient()) { try { var time = DateTools.GetUnix(); var nonce = System.Guid.NewGuid().ToString(); var httpMethod = "GET"; var accept = "application/json"; var contentMD5 = ""; var contentType = "application/json; charset=utf-8"; var date = DateTools.ConvertToGMT(); var headers = new List <KeyValuePair <String, String> >(); headers.Add(new KeyValuePair <String, String>("X-Ca-Key", AppKey)); headers.Add(new KeyValuePair <String, String>("X-Ca-Nonce", nonce)); headers.Add(new KeyValuePair <String, String>("X-Ca-Timestamp", time.ToString() + "000")); //headers.Add(new KeyValuePair<String, String>("X-Ca-Stage", "RELEASE")); //headers.Add(new KeyValuePair<String, String>("X-Ca-Request-Mode", "debug")); headers.Sort((KeyValuePair <string, string> a, KeyValuePair <string, string> b) => { return(string.Compare(a.Key, b.Key, StringComparison.Ordinal)); }); var headSign = ""; foreach (var header in headers) { headSign += header.Key + ":" + header.Value + "\n"; } var url = ""; var urlSign = ""; var _kvs = new List <KeyValuePair <String, String> >(kvs); _kvs.Sort((KeyValuePair <string, string> a, KeyValuePair <string, string> b) => { return(string.Compare(a.Key, b.Key, StringComparison.Ordinal)); }); foreach (var kv in _kvs) { url += kv.Key + "=" + kv.Value + "&"; if (string.IsNullOrEmpty(kv.Value)) { urlSign += kv.Key + "&"; } else { urlSign += kv.Key + "=" + kv.Value + "&"; } } url = (ApiHost + ApiPath + "?" + url).TrimEnd('&', '?'); urlSign = (ApiPath + "?" + urlSign).TrimEnd('&', '?'); var hmac = new System.Security.Cryptography.HMACSHA256() { Key = Encoding.UTF8.GetBytes(AppSecret.ToCharArray()) }; var signStr = httpMethod + "\n" + accept + "\n" + contentMD5 + "\n" + contentType + "\n" + date + "\n" + headSign + urlSign; var sign = System.Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(signStr.ToCharArray()))); #region var uri = new Uri(url); var hostSocket = Net.WlnSocket.GetSocket(uri.Host, uri.Port); try { var reqStr = ""; reqStr += "GET " + uri.PathAndQuery + " HTTP/1.1"; reqStr += "\r\nHost: " + uri.Host; reqStr += "\r\nDate: " + date; reqStr += "\r\nAccept: " + accept; reqStr += "\r\nContent-MD5: " + contentMD5; reqStr += "\r\nContent-Type: " + contentType; foreach (var header in headers) { reqStr += "\r\n" + header.Key + ": " + header.Value; } reqStr += "\r\nX-Ca-Signature: " + sign; reqStr += "\r\nX-Ca-Signature-Headers: " + strUtil.Join(",", headers.Select(a => a.Key).ToArray()); reqStr += "\r\n"; reqStr += "\r\n"; var request = Encoding.UTF8.GetBytes(reqStr); if (hostSocket.Send(request, request.Length, System.Net.Sockets.SocketFlags.None) > 0) { var str = ""; var length = 0; var end = false; var start = false; var chunked = false; while (true) { var rev = new byte[65535]; var index = hostSocket.Receive(rev, rev.Length, System.Net.Sockets.SocketFlags.None); if (index == 0) { break; } var tempstr = strUtil.GetUTF8String(rev, 0, index); var lines = tempstr.Split(new string[] { "\r\n" }, StringSplitOptions.None); index = 0; #region Headers处理 if (!start && lines[0].StartsWith("HTTP")) { var ts = lines[0].Split(' '); if (ts[1] == "200") { for (index = 1; index < lines.Length; index++) { if (lines[index].ToLower().StartsWith("content-length")) { ts = lines[index].Split(' '); length = cvt.ToInt(ts[1]); } else if (lines[index].ToLower().StartsWith("transfer-encoding")) { chunked = lines[index].EndsWith("chunked"); } if (string.IsNullOrEmpty(lines[index])) { index++; start = true; break; } } } else { foreach (var line in lines) { if (line.SplitBy(":")[0] == "X-Ca-Error-Message") { rlt.message = line.Substring(line.IndexOf(' ') + 1); return(rlt); } } rlt.message = lines.LastOrDefault(); index = lines.Length; break; } } #endregion #region 取文本内容 for (; index < lines.Length; index++) { var line = lines[index]; if (chunked) { index++; if (index < lines.Length) { var tempLength = cvt.DeHex(line, "0123456789abcdef"); if (tempLength > 0) { length += (int)tempLength; line = lines[index]; } else if (lines.Length == index + 2 && string.IsNullOrEmpty(lines[index + 1])) { end = true; break; } else { break; } } else { break; } } if (index == 0 || (chunked && index == 1) || str.Length == 0) { str += line; } else { str += "\r\n" + line; } if (!chunked && System.Text.Encoding.UTF8.GetBytes(str).Length >= length) { end = true; } } if (end) { break; } #endregion } if (!string.IsNullOrEmpty(str)) { rlt.success = true; rlt.message = ""; rlt.data = str; } } hostSocket.Using = false; } catch (Exception ex) { hostSocket.Using = false; rlt.message = ex.Message; } #endregion } catch { } } } return(rlt); }
/// <summary> /// /// </summary> /// <param name="filterContext"></param> public override void OnActionExecuting(ActionExecutingContext filterContext) { _rlt.success = false; _rlt.message = ""; _rlt.data = ""; var AppId = GetRequest("xsappid"); var TimeSpan = GetRequest("xstime"); if (string.IsNullOrEmpty(AppId)) { _rlt.message = "xsappid is missing"; var result = new ContentResult(); result.Content = Wlniao.Json.ToString(_rlt); filterContext.Result = result; } else if (cvt.ToLong(TimeSpan) < DateTools.GetUnix() - 3600) { _rlt.message = "request is expired"; var result = new ContentResult(); result.Content = Wlniao.Json.ToString(_rlt); filterContext.Result = result; } else { if (_cache.ContainsKey(AppId)) { app = _cache[AppId]; } else { if (AppId == XServer.Common.AppId) { //使用同一对AppId及Secret app = new XsApp(); app.appid = XServer.Common.AppId; app.secret = XServer.Common.Secret; app.domain = ""; app.xclient = false; app.appname = "Default"; } else { var rlt = XServer.XsApp.GetById(AppId); if (rlt.success) { app = rlt.data; _rlt.PutLog(rlt.logs); if (app.xclient && filterContext.ActionDescriptor.FilterDescriptors.Where(a => a.Filter.ToString().Contains("Wlniao.Mvc.XClientAttribute")).ToList().Count() == 0) { _rlt.message = "not allow xclient app"; var result = new ContentResult(); result.Content = Wlniao.Json.ToString(_rlt); filterContext.Result = result; return; } } } } if (app == null || app.appid.IsNullOrEmpty()) { _rlt.message = "xsappid is invalid"; var result = new ContentResult(); result.Content = Wlniao.Json.ToString(_rlt); filterContext.Result = result; } else { var list = new List <KeyValuePair <String, String> >(); foreach (string key in Request.Query.Keys) { list.Add(new KeyValuePair <string, string>(key, Request.Query[key])); } list.Sort(delegate(KeyValuePair <String, String> small, KeyValuePair <String, String> big) { return(small.Key.CompareTo(big.Key)); }); var values = new System.Text.StringBuilder(); foreach (var param in list) { if (!string.IsNullOrEmpty(param.Value) && param.Key != "sig") { values.Append(param.Value); } } values.Append(app.secret); var md5_result = System.Security.Cryptography.MD5.Create().ComputeHash(System.Text.Encoding.UTF8.GetBytes(values.ToString())); var sig_builder = new System.Text.StringBuilder(); foreach (byte b in md5_result) { sig_builder.Append(b.ToString("x2")); } if (GetRequest("sig") != sig_builder.ToString()) { if (_cache.ContainsKey(AppId)) { _cache.Remove(AppId); } _rlt.message = "signature error"; var result = new ContentResult(); result.Content = Wlniao.Json.ToString(_rlt); filterContext.Result = result; } else if (!_cache.ContainsKey(AppId)) { _cache.Add(AppId, app); } } } base.OnActionExecuting(filterContext); }
/// <summary> /// 通过Socket发送Http请求 /// </summary> /// <param name="url"></param> /// <param name="kvs"></param> /// <returns></returns> public static String HttpGet(String url, params KeyValuePair <String, String>[] kvs) { var sb = new System.Text.StringBuilder(); var uri = new Uri(url); var hostSocket = Net.WlnSocket.GetSocket(uri.Host, uri.Port); try { var reqStr = ""; reqStr += "GET " + uri.PathAndQuery + " HTTP/1.1"; reqStr += "\r\nHost: " + uri.Host; reqStr += "\r\nDate: " + DateTools.ConvertToGMT(DateTools.GetUnix()); reqStr += "\r\nAccept: application/json"; if (kvs != null) { foreach (var kv in kvs) { reqStr += "\r\n" + kv.Key + ": " + kv.Value; } } reqStr += "\r\n"; reqStr += "\r\n"; var request = Encoding.UTF8.GetBytes(reqStr); if (hostSocket.Send(request, request.Length, System.Net.Sockets.SocketFlags.None) > 0) { var length = 0; var end = false; var start = false; var chunked = false; while (true) { var rev = new byte[65535]; var index = hostSocket.Receive(rev, rev.Length, System.Net.Sockets.SocketFlags.None); if (index == 0) { break; } var tempstr = Encoding.UTF8.GetString(rev, 0, index); var lines = tempstr.Split(new string[] { "\r\n" }, StringSplitOptions.None); index = 0; #region Headers处理 if (!start && lines[0].StartsWith("HTTP")) { var ts = lines[0].Split(' '); if (ts[1] == "200") { for (index = 1; index < lines.Length; index++) { if (lines[index].ToLower().StartsWith("content-length")) { ts = lines[index].Split(' '); length = cvt.ToInt(ts[1]); } else if (lines[index].ToLower().StartsWith("transfer-encoding")) { chunked = lines[index].EndsWith("chunked"); } if (string.IsNullOrEmpty(lines[index])) { index++; start = true; break; } } } else { index = lines.Length; break; } } #endregion #region 取文本内容 for (; index < lines.Length; index++) { var line = lines[index]; if (chunked) { index++; if (index < lines.Length) { var tempLength = cvt.DeHex(line, "0123456789abcdef"); if (tempLength > 0) { length += (int)tempLength; line = lines[index]; } else if (lines.Length == index + 2 && string.IsNullOrEmpty(lines[index + 1])) { end = true; break; } else { break; } } else { break; } } if (index == 0 || (chunked && index == 1) || sb.Length == 0) { sb.Append(line); } else { sb.Append("\r\n" + line); } if (!chunked && System.Text.Encoding.UTF8.GetBytes(sb.ToString()).Length >= length) { end = true; } } if (end) { break; } #endregion } } hostSocket.Using = false; } catch { } return(sb.ToString()); }
/// <summary> /// FormAPI参数 /// </summary> /// <param name="expire">过期时间(单位:秒)</param> /// <param name="max">文件最大大小</param> /// <param name="dir">上传目录</param> /// <returns></returns> public static String FormApi(int expire, int max, string dir) { Load(); max = max * 1024 * 1024; if (!string.IsNullOrEmpty(bucketname) && !string.IsNullOrEmpty(formapi)) { if (string.IsNullOrEmpty(dir)) { dir = "/{year}{mon}/{mon}{day}/"; } else { if (!dir.StartsWith("/")) { dir = "/" + dir; } if (!dir.EndsWith("/")) { dir = dir + "/"; } } var json = "{\"bucket\":\"" + bucketname + "\",\"save-key\":\"" + dir + "{random}{.suffix}\",\"expiration\":\"" + (DateTools.GetUnix() + expire) + "\"}"; var policy = Encryptor.Base64Encrypt(json); var signature = Encryptor.Md5Encryptor32(policy + "&" + formapi); return(Json.ToString(new { host = XStorageUrl, bucket = bucketname, policy, signature })); } return(""); }
/// <summary> /// FormAPI参数 /// </summary> /// <param name="expire">过期时间(单位:秒)</param> /// <param name="max">文件最大大小</param> /// <returns></returns> public static String FormApi(int expire = 5400, int max = 200) { Load(); max = max * 1024 * 1024; if (!string.IsNullOrEmpty(bucketname) && !string.IsNullOrEmpty(formapi)) { var json = "{\"bucket\":\"" + bucketname + "\",\"save-key\":\"/{year}{mon}/{mon}{day}/{random}{.suffix}\",\"expiration\":\"" + (DateTools.GetUnix() + expire) + "\"}"; var policy = Encryptor.Base64Encrypt(json); var signature = Encryptor.Md5Encryptor32(policy + "&" + formapi); return(Json.ToString(new { host = XStorageUrl, bucket = bucketname, policy, signature })); } return(""); }