private static HttpResponseMessage newWorker(string method, string Url, byte[] postData = null, Hashtable headers = null) { using (var client = new HttpClient()) { var request = new HttpRequestMessage(new HttpMethod(method), "http://" + api_domain + Url); if (headers == null) { headers = new Hashtable(); } headers.Add("mkdir", "true"); if (upAuth) { var date = DateTools.ConvertToGMT(); var auth = Encryptor.Md5Encryptor32(method + '&' + Url + '&' + date + '&' + (postData == null ? 0 : postData.Length) + '&' + Encryptor.Md5Encryptor32(password).ToLower()); request.Headers.TryAddWithoutValidation("Date", date); request.Headers.TryAddWithoutValidation("Authorization", "UpYun " + username + ':' + auth); } else { request.Headers.TryAddWithoutValidation("Authorization", "Basic " + System.Convert.ToBase64String(new System.Text.ASCIIEncoding().GetBytes(username + ":" + password))); } foreach (DictionaryEntry var in headers) { request.Headers.Add(var.Key.ToString(), var.Value.ToString()); } if (postData != null) { request.Content = new StreamContent(new MemoryStream(postData)); } client.SendAsync(request).ContinueWith((requestTask) => { return(requestTask.Result); }).Wait(); return(new HttpResponseMessage()); } }
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> /// 通过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()); }