private void Raise(HttpCallback cb, HttpParser p) { if (null != cb) { cb(p); } }
IEnumerator getAsync(string url, HttpCallback callbackFunc) { var api = ""; if (apiKey != "") { api = "?X-Api-Key=" + apiKey; } url = url + api; Debug.Log(url); WWW www = new WWW(url); yield return(www); if (!string.IsNullOrEmpty(www.error)) { Debug.Log(www.error); callbackFunc(true, www.error); } else { Debug.Log(www.text); callbackFunc(false, www.text); } }
private static async void doHttp(SdSource source, String url, Dictionary<String, String> args, SdNode config, __CacheBlock cache, HttpCallback callback) { var encoding = Encoding.GetEncoding(config.encode()); AsyncHttpClient client = new AsyncHttpClient(); if (config.isInCookie() && string.IsNullOrEmpty(source.cookies()) == false) { client.Cookies(source.cookies()); } client.Header("User-Agent", source.ua()); client.Encoding(config.encode()); string newUrl = null; if (url.IndexOf(" ") >= 0) newUrl = Uri.EscapeUriString(url); else newUrl = url; if (config.isInReferer()) { client.Header("Referer", source.buildReferer(config, url)); } if (string.IsNullOrEmpty(config.accept) == false) { client.Header("Accept", config.accept); client.Header("X-Requested-With", "XMLHttpRequest"); } client.Url(newUrl); string temp = null; try { AsyncHttpResponse rsp = null; if ("post".Equals(config.method)) rsp = await client.Post(args); else rsp = await client.Get(); if (rsp.StatusCode == HttpStatusCode.Ok) { source.setCookies(rsp.Cookies); temp = rsp.GetString(); } } catch(Exception ex) { Util.log(source, "HTTP", ex.Message); } if (temp == null) { if (cache == null) callback(-2, null); else callback(1, cache.value); } else callback(1, temp); }
public RequestTask Get(string url, bool needUnZip, int timeout, HttpCallback callback) { UnityWebRequest request = UnityWebRequest.Get(url); if (timeout > 0) { request.timeout = timeout; } return(AddRequestTask(request, url, "", needUnZip, callback)); }
private void Raise(HttpCallback cb, HttpParser p) { if (cb == null) { return; } try { cb(p); } catch (Exception e) { Console.WriteLine(e); RaiseOnError(p, e.Message, null, -1); return; } }
IEnumerator CoUpdateUserData(HttpCallback onComplete) { WWWForm formData = new WWWForm(); formData.AddField("_method", "put"); formData.AddField("level", level); formData.AddField("exp", exp); formData.AddField("rexp", rexp); formData.AddField("totalKills", totalKills); formData.AddField("spentCash", spentCash); formData.AddField("killsGlock", killsGlock); formData.AddField("killsMp5k", killsMp5k); formData.AddField("killsM870", killsM870); formData.AddField("killsAkm", killsAkm); formData.AddField("killsPython", killsPython); formData.AddField("killsUmp45", killsUmp45); WWW httpResult = new WWW("http://<YOUR_SERVER_IP>/user?token=" + token, formData); yield return(httpResult); if (httpResult.responseHeaders.Count > 0) { string statusText = httpResult.responseHeaders["STATUS"]; int statusCode = HttpHelper.GetStatusCode(statusText); JsonData resultJson = JsonMapper.ToObject(httpResult.text); if (statusCode == 200) { onComplete(null); } else { string errorMessage = (string)resultJson["message"]; onComplete(errorMessage); } } else { onComplete("Invalid HTTP Response"); } }
IEnumerator postAsyncJSON(string url, string parameters, HttpCallback callbackFunc) { WWW www; Hashtable postHeader = new Hashtable(); postHeader.Add("Content-Type", "application/json"); if (apiKey != "") { postHeader.Add("X-Api-Key", apiKey); } Debug.Log(url); Debug.Log(parameters); // convert json string to byte var formData = System.Text.Encoding.UTF8.GetBytes(parameters); www = new WWW(url, formData, postHeader); yield return(www); if (!string.IsNullOrEmpty(www.error)) { Debug.Log(www.error); if (!string.IsNullOrEmpty(www.text)) { callbackFunc(true, www.text); } else { callbackFunc(true, www.error); } } else { Debug.Log(www.text); callbackFunc(false, www.text); } }
public void Start(ref string strURL, ref string strPostString, HttpCallback callback, object extrans, bool bImmediate = false) { m_strURL = strURL; m_PostString = strPostString; this.m_httpCallback += callback; this.param = extrans; if (!bImmediate) { m_httpThread = new Thread(this.Proc); if (m_httpThread != null) { m_httpThread.Start(); } } else { Proc(); } }
IEnumerator CoGetUserData(HttpCallback onComplete) { WWW httpResult = new WWW("http://<YOUR_SERVER_IP>/user?token=" + token); yield return(httpResult); if (httpResult.responseHeaders.Count > 0) { string statusText = httpResult.responseHeaders["STATUS"]; int statusCode = HttpHelper.GetStatusCode(statusText); JsonData resultJson = JsonMapper.ToObject(httpResult.text); if (statusCode == 200) { level = (int)resultJson["level"]; exp = (int)resultJson["exp"]; rexp = (int)resultJson["rexp"]; totalPlays = (int)resultJson["totalPlays"]; totalKills = (int)resultJson["totalKills"]; spentCash = (int)resultJson["spentCash"]; killsGlock = (int)resultJson["kills"]["glock"]; killsMp5k = (int)resultJson["kills"]["mp5k"]; killsM870 = (int)resultJson["kills"]["m870"]; killsAkm = (int)resultJson["kills"]["akm"]; killsPython = (int)resultJson["kills"]["python"]; killsUmp45 = (int)resultJson["kills"]["ump45"]; onComplete(null); } else { string errorMessage = (string)resultJson["message"]; onComplete(errorMessage); } } else { onComplete("Invalid HTTP Response"); } }
public async static void http(SdSource source, bool isUpdate, String url, Dictionary<String, String> args, SdNode config, HttpCallback callback) { __CacheBlock block = null; if (isUpdate == false && config.cache > 0) { block = cache.get(url); } if (block != null) { if (config.cache == 1 || block.seconds() <= config.cache) { await Task.Delay(100); callback(1, block.value); return; } } doHttp(source, url, args, config, block,(code, data) => { if (code == 1 && config.cache > 0) { cache.save(url, data); } callback(code, data); }); }
IEnumerator postAsync(string urlString, Dictionary <string, string> parameters, HttpCallback callbackFunc) { WWWForm form = new WWWForm(); foreach (string paramKey in parameters.Keys) { form.AddField(paramKey, parameters[paramKey]); } var headers = form.headers; var rawData = form.data; WWW www = new WWW(urlString, rawData, headers); yield return(www); if (!string.IsNullOrEmpty(www.error)) { Debug.Log(www.error); if (!string.IsNullOrEmpty(www.text)) { callbackFunc(true, www.text); } else { callbackFunc(true, www.error); } } else { Debug.Log(www.text); callbackFunc(false, www.text); } }
public static IEnumerator HttpGet(string url, HttpCallback callback = null) { UnityWebRequest request = UnityWebRequest.Get(url); yield return(request.SendWebRequest()); JsonData jd = null; if (request.isNetworkError) { Debug.Log("request url: " + url + " error: " + request.error); } else if (request.responseCode == 200) { string text = request.downloadHandler.text; // Debug.Log(text); jd = JsonMapper.ToObject(text); } if (callback != null) { callback.Invoke(jd); } }
/// <summary> /// Raises <see cref="HttpCallback"/> event /// </summary> /// <param name="sender">Event sender - a <see cref="TcpClient"/> object representing agent client</param> /// <param name="e">Event parameters</param> protected virtual void OnHttpCallback(object sender, HttpCallbackEventArgs e) { HttpCallback?.Invoke(sender, e); }
/// <summary> /// 同步验证请求 /// </summary> /// <param name="url">地址</param> /// <param name="encoding">编码</param> /// <param name="headers">请求头</param> /// <param name="callback">同步委托</param> public static void optionsSyncTo(string url, Encoding encoding, IDictionary <string, object> headers, HttpCallback callback) { httpTo(false, "OPTIONS", null, encoding, url, null, headers, callback); }
RequestTask AddRequestTask(UnityWebRequest request, string url, string saveFileFullPath, bool needUnZip, HttpCallback callback, bool first = false, bool isAssetBundle = false, string matchMd5 = null) { RequestTask requestTask = new RequestTask(); requestTask.request = request; requestTask.status = RequestTask.EStatus.Created; requestTask.run = (self) => { self.status = RequestTask.EStatus.Running; float startTime = Time.realtimeSinceStartup; UnityWebRequestAsyncOperation asyncOper = request.SendWebRequest(); asyncOper.completed += (result) => { try { if (isAssetBundle) { OnRequestAssetBundleComplete(self.request, startTime, saveFileFullPath, callback, matchMd5); self.status = RequestTask.EStatus.Completed; } else { Task task = OnRequestComplete(self.request, startTime, needUnZip, saveFileFullPath, callback, matchMd5); if (task == null) { self.status = RequestTask.EStatus.Completed; } else { self.ioTask = task; } } } catch (System.Exception e) { Debug.LogWarning(e); self.status = RequestTask.EStatus.Completed; } }; }; if (first) { _httpRequestList.Insert(0, requestTask); } else { _httpRequestList.Add(requestTask); } return(requestTask); }
private void Raise (HttpCallback cb, HttpParser p) { if (null != cb) cb (p); }
private static void ExecHttpTo(bool async, Encoding encoding, HttpWebRequest request, HttpCallback callback) { dynamic ret; AsyncCallback callback2 = null; if (async) { if (callback2 == null) { callback2 = delegate(IAsyncResult item) { try { using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(item)) { if (response.StatusCode == HttpStatusCode.OK) { using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding)) { string req = reader.ReadToEnd(); try { ret = JsonConvert.DeserializeObject(req) ?? req; } catch { ret = req; } callback(ret, response); } } else { callback("请求错误:" + response.StatusCode.ToString(), response); } } if (request != null) { request.Abort(); } } catch (Exception ex) { BaseUtility.LogError.Error(request.RequestUri + ":" + ex.ToString()); } }; } request.BeginGetResponse(callback2, null); } else { try { using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { if (response.StatusCode == HttpStatusCode.OK) { using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding)) { string req = reader.ReadToEnd(); try { ret = JsonConvert.DeserializeObject(req) ?? req; } catch { ret = req; } callback(ret, response); } } else { callback("请求错误:" + response.StatusCode.ToString(), response); } } if (request != null) { request.Abort(); } } catch (Exception ex) { BaseUtility.LogError.Error(request.RequestUri + ":" + ex.ToString()); } } }
private Task OnRequestAssetBundleComplete(UnityWebRequest request, float startTime, string saveFileFullPath, HttpCallback callback, string matchMd5 = null) { Dictionary <string, object> dict = new Dictionary <string, object>(); int respCode = (int)request.responseCode; dict.Add("status", respCode); bool succeed = !request.isHttpError && !request.isNetworkError; if (succeed) //success and save assetBundle to disk. { float endTime = Time.realtimeSinceStartup; ulong size = request.downloadedBytes; float speed = size / (endTime - startTime); dict.Add("size", size); dict.Add("speed", speed); string data = ""; // get assetBundle bytes byte[] downloadBytes = request.downloadHandler.data; // compare md5 if (matchMd5 != null && StringUtils.BytesToMD5(downloadBytes) != matchMd5) { data = string.Format("{{\"code\":5,\"message\":\"{0}\"}}", "assetBundle md5 not match"); dict.Add("data", data); } else { data = "ok"; dict.Add("data", data); AssetBundle assetBundle = AssetBundle.LoadFromMemory(downloadBytes); dict.Add("assetBundle", assetBundle); // save assetBundle to disk. Task threadTask = new Task((bytes) => { SaveFile(saveFileFullPath, (byte[])bytes); }, downloadBytes); lock ( _ioTaskList ) { IOTask newTask = new IOTask(); newTask.threadTask = threadTask; newTask.callback = (status) => { if (status != IOTask.RESULT_SUCCESS) { StringBuilder sb = new StringBuilder(); foreach (var ex in threadTask.Exception.InnerExceptions) { sb.Append(ex.Message); sb.Append("\n"); } Debug.LogError(sb.ToString()); } }; _ioTaskList.Add(newTask); } // no need to wait after assetBundle is saved to disk. callback(dict); DisposeWebRequesat(request); return(threadTask); } } else { if (request.error != null) { dict.Add("data", request.error); } else { dict.Add("data", "request error, respCode: " + respCode.ToString()); } } callback(dict); DisposeWebRequesat(request); return(null); }
public void Get(HttpCallback callback) { StartCoroutine(CoGetUserData(callback)); }
public void UpdateData(HttpCallback callback) { StartCoroutine(CoUpdateUserData(callback)); }
private static async void doHttp(SdSource source, HttpMessage msg, __CacheBlock cache, HttpCallback callback) { var encoding = Encoding.GetEncoding(msg.config.encode()); AsyncHttpClient client = new AsyncHttpClient(); client.UserAgent(msg.config.ua()); client.Encoding(msg.config.encode()); foreach (String key in msg.header.Keys) { client.Header(key, msg.header[key]); } string newUrl = null; if (msg.url.IndexOf(" ") >= 0) { newUrl = Uri.EscapeUriString(msg.url); } else { newUrl = msg.url; } client.Url(newUrl); string temp = null; AsyncHttpResponse rsp = null; try { if ("post".Equals(msg.config.method)) { rsp = await client.Post(msg.form); } else { rsp = await client.Get(); } if (rsp.StatusCode == HttpStatusCode.OK) { source.setCookies(rsp.Cookies); temp = rsp.GetString(); if (string.IsNullOrEmpty(rsp.location) == false) { Uri uri = new Uri(msg.url); rsp.location = uri.Scheme + "://" + uri.Host + rsp.location; } } } catch (Exception ex) { Util.log(source, "HTTP", ex.Message); } if (temp == null) { if (cache == null || cache.value == null) { callback(-2, msg, null, rsp.location); } else { callback(1, msg, cache.value, rsp.location); } } else { callback(1, msg, temp, rsp.location); } }
public KeyChainAliasCallback(HttpCallback callback) { _callback = callback; }
public RequestTask Post(string url, Dictionary <string, string> formFields, bool needUnZip, int timeout, HttpCallback callback) { UnityWebRequest request = UnityWebRequest.Post(url, formFields); if (timeout > 0) { request.timeout = timeout; } return(AddRequestTask(request, url, "", needUnZip, callback)); }
/// <summary> /// get 同步请求 /// </summary> /// <param name="url">请求地址</param> /// <param name="encoding">编码</param> /// <param name="parms">请求参数</param> /// <param name="headers">请求头部参数</param> /// <param name="callback">同步执行委托</param> public static void getSyncTo(string url, Encoding encoding, IDictionary <string, object> parms, IDictionary <string, object> headers, HttpCallback callback) { httpTo(false, "GET", null, encoding, url, parms, headers, callback); }
private static async void doHttp(SdSource source, HttpMessage msg, __CacheBlock cache, HttpCallback callback) { var encoding = Encoding.GetEncoding(msg.config.encode()); AsyncHttpClient client = new AsyncHttpClient(); client.UserAgent(msg.config.ua()); client.Encoding(msg.config.encode()); foreach (String key in msg.header.Keys) { client.Header(key, msg.header[key]); } string newUrl = null; if (msg.url.IndexOf(" ") >= 0) newUrl = Uri.EscapeUriString(msg.url); else newUrl = msg.url; client.Url(newUrl); string temp = null; AsyncHttpResponse rsp = null; try { if ("post".Equals(msg.config.method)) rsp = await client.Post(msg.form); else rsp = await client.Get(); if (rsp.StatusCode == HttpStatusCode.OK) { source.setCookies(rsp.Cookies); temp = rsp.GetString(); if (string.IsNullOrEmpty(rsp.location) == false) { Uri uri = new Uri(msg.url); rsp.location = uri.Scheme + "://" + uri.Host + rsp.location; } } } catch (Exception ex) { Util.log(source, "HTTP", ex.Message); } if (temp == null) { if (cache == null || cache.value == null) callback(-2, msg, null, rsp.location); else callback(1, msg, cache.value, rsp.location); } else callback(1, msg, temp, rsp.location); }
/// <summary> /// post表单 同步请求 /// </summary> /// <param name="url">请求地址</param> /// <param name="encoding">编码</param> /// <param name="parms">请求参数</param> /// <param name="headers">请求头部参数</param> /// <param name="callback">同步执行委托</param> public static void postSyncAsForm(string url, Encoding encoding, IDictionary <string, object> parms, IDictionary <string, object> headers, HttpCallback callback) { httpTo(false, "POST", "application/x-www-form-urlencoded", encoding, url, parms, headers, callback); }
/// <summary> /// post json参数 异步请求 /// </summary> /// <param name="url">请求地址</param> /// <param name="encoding">编码</param> /// <param name="parms">请求参数</param> /// <param name="headers">请求头部参数</param> /// <param name="callback">异步执行委托</param> public static void postAsyncAsJSON(string url, Encoding encoding, IDictionary <string, object> parms, IDictionary <string, object> headers, HttpCallback callback) { httpTo(true, "POST", "application/json", encoding, url, parms, headers, callback); }
private static void GetCertificate(HttpCallback callback) { KeyChain.ChoosePrivateKeyAlias(CrossCurrentActivity.Current.Activity, new KeyChainAliasCallback(callback), null, null, null, null); }
public RequestTask DownloadFile(string url, string saveFileFullPath, bool needUnZip, int timeout, HttpCallback callback, bool first = false, string matchMd5 = null) { if (string.IsNullOrEmpty(saveFileFullPath)) { Debug.LogWarning("No fullFilePath, is there any error?"); } UnityWebRequest request = UnityWebRequest.Get(url); if (timeout > 0) { request.timeout = timeout; } return(AddRequestTask(request, url, saveFileFullPath, needUnZip, callback, first, false, matchMd5)); }
public RequestTask DownLoadAssetBundle(string url, string saveFileFullPath, int timeout, HttpCallback callback, bool first = true, string matchMd5 = null) { if (string.IsNullOrEmpty(saveFileFullPath)) { Debug.LogError("No fullFilePath, cancel the downloading op"); return(null); } UnityWebRequest request = UnityWebRequest.Get(url); if (timeout > 0) { request.timeout = timeout; } return(AddRequestTask(request, url, saveFileFullPath, false, callback, first, true, matchMd5)); }
private Task OnRequestComplete(UnityWebRequest request, float startTime, bool needUnZip, string saveFileFullPath, HttpCallback callback, string matchMd5 = null) { Dictionary <string, object> dict = new Dictionary <string, object>(); int respCode = (int)request.responseCode; dict.Add("status", respCode); bool succeed = !request.isHttpError && !request.isNetworkError; if (succeed) { float endTime = Time.realtimeSinceStartup; ulong size = request.downloadedBytes; float speed = size / (endTime - startTime); dict.Add("size", size); dict.Add("speed", speed); string data = ""; if (needUnZip) { int ret = TryGetHttpData(request.downloadHandler.data, out data, true); if (ret != IO_RESULT_SUCCESS) { data = "{\"code\":0,\"data\":\"data unzip fail\"}"; } } else { // no need to save. if (string.IsNullOrEmpty(saveFileFullPath)) { data = request.downloadHandler.text; } else { byte[] downloadBytes = request.downloadHandler.data; //compare md5 if (matchMd5 != null && StringUtils.BytesToMD5(downloadBytes) != matchMd5) { data = string.Format("{{\"code\":5,\"message\":\"{0}\"}}", "md5 not match"); } else { Task threadTask = new Task((bytes) => { SaveFile(saveFileFullPath, (byte[])bytes); }, downloadBytes); lock ( _ioTaskList ) { IOTask newTask = new IOTask(); newTask.threadTask = threadTask; newTask.callback = (status) => { if (status == IOTask.RESULT_SUCCESS) { data = "ok"; dict.Add("data", data); } else { StringBuilder sb = new StringBuilder(); foreach (var ex in threadTask.Exception.InnerExceptions) { string s = ex.Message.Replace("\\", "\\\\"); sb.Append(s.Replace("\"", "\\\"")); sb.Append("\n"); } data = string.Format("{{\"code\":0,\"message\":\"{0}\"}}", sb.ToString()); Debug.LogError(data); dict.Add("data", data); } callback(dict); }; _ioTaskList.Add(newTask); } DisposeWebRequesat(request); return(threadTask); } } } dict.Add("data", data); } else { if (request.error != null) { dict.Add("data", request.error); } else { dict.Add("data", "request error, respCode:" + respCode.ToString()); } } callback(dict); DisposeWebRequesat(request); return(null); }
public RequestTask Post(string url, string data, bool needUnZip, int timeout, HttpCallback callback) { return(Post(url, GetPostData(data), needUnZip, timeout, callback)); }
/// <summary> /// http请求 /// </summary> /// <param name="async">异步开启关闭</param> /// <param name="method">请求方法</param> /// <param name="contentType"></param> /// <param name="url">地址</param> /// <param name="parms">参数</param> /// <param name="headers">请求头</param> /// <param name="callback">异步执行方法</param> public static void httpTo(bool async, string method, string contentType, Encoding encoding, string url, IDictionary <string, object> parms, IDictionary <string, object> headers, HttpCallback callback) { string str; Func <string, string> selector = null; Func <string, string> func2 = null; if ((method.ToUpper() == "GET") && ((parms != null) && (parms.Count > 0))) { if (selector == null) { selector = item => (item + "=" + parms[item]) ?? ""; } str = string.Join("&", parms.Keys.Select <string, string>(selector)); if (url.IndexOf("?") != -1) { url = url + "?" + str; } else { url = url + "&" + str; } } //System.Net.ServicePointManager.DefaultConnectionLimit = 10; //垃圾回收 System.GC.Collect(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = method; //request.Proxy = null; //代理设为空 request.KeepAlive = false; //不保持连接 if ((headers != null) && (headers.Count > 0)) { foreach (string str2 in headers.Keys) { request.Headers.Add(str2, Convert.ToString(headers[str2])); } } //编码方式 Encoding enCode = Encoding.UTF8; if (encoding != null) { enCode = Encoding.Default; } if (method.ToUpper() == "POST") { request.ContentType = contentType; if ((parms != null) && (parms.Count > 0)) { byte[] bytes = null; if (contentType.ToLower() == "application/x-www-form-urlencoded") { if (func2 == null) { func2 = item => (item + "=" + parms[item]) ?? ""; } str = string.Join("&", parms.Keys.Select <string, string>(func2)); bytes = enCode.GetBytes(str); } else if (contentType.ToLower() == "application/json") { bytes = enCode.GetBytes(JsonConvert.SerializeObject(parms)); } if ((bytes != null) && (bytes.Length > 0)) { request.ContentLength = bytes.Length; Stream requestStream = request.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); } } } //执行请求 ExecHttpTo(async, enCode, request, callback); }
private int Raise(HttpCallback cb, HttpParser p) { if (cb == null) return 0; try { return cb (p); } catch (Exception e) { Console.WriteLine (e); RaiseOnError (p, e.Message, null, -1); return -1; } }
public void UploadFile(string url, string fullFilePath, bool needUnZip, int timeout, HttpCallback callback) { if (!File.Exists(fullFilePath)) { Dictionary <string, object> dict = new Dictionary <string, object>(); dict.Add("data", "file not exists !"); dict.Add("status", IO_RESULT_FAIL); callback(dict); return; } byte[] fileData = null; //read file data Task threadTask = new Task(() => { using (FileStream fileStream = new FileStream(fullFilePath, FileMode.Open)) { int dataLen = (int)fileStream.Length; if (dataLen > 0) { fileData = new byte[dataLen]; fileStream.Read(fileData, 0, dataLen); } } }); //add to io task queue lock ( _ioTaskList ) { IOTask newTask = new IOTask(); newTask.threadTask = threadTask; newTask.callback = (status) => { if (status == IOTask.RESULT_SUCCESS) { if (fileData == null) { Dictionary <string, object> dict = new Dictionary <string, object>(); dict.Add("data", "file data is empty!"); dict.Add("status", IO_RESULT_FAIL); callback(dict); } else { UnityWebRequest request = UnityWebRequest.Put(url, fileData); if (timeout > 0) { request.timeout = timeout; } AddRequestTask(request, url, "", needUnZip, callback); } } else { StringBuilder sb = new StringBuilder(); foreach (var ex in threadTask.Exception.InnerExceptions) { sb.Append(ex.Message); sb.Append("\n"); } string data = string.Format("{{\"code\":0,\"message\":\"read error:{0}\"}}", sb.ToString()); Dictionary <string, object> dict = new Dictionary <string, object>(); dict.Add("data", data); dict.Add("status", IO_RESULT_FAIL); callback(dict); } }; _ioTaskList.Add(newTask); } }