public static void InvokeAsync <T>(Api api, Method method, string url, Dictionary <string, string> headers, object data, AsyncCallback <T> callback) { ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object t) { SocketResponse response = null; try { Uri uri = new Uri(url); int maximumRetryCount = 5; int retry = 0; while (++retry < maximumRetryCount) { TcpClient client = new TcpClient(); client.Connect(uri.Host, uri.Port); using (NetworkStream stream = client.GetStream()) { Stream ostream = stream as Stream; if (uri.Scheme.ToLower() == "https") { ostream = new SslStream(stream, false, new RemoteCertificateValidationCallback(ValidateServerCertificate)); try { SslStream ssl = ostream as SslStream; ssl.AuthenticateAsClient(uri.Host); } catch (System.Exception e) { BackendlessFault backendlessFault = new BackendlessFault(e); if (callback != null) { callback.ErrorHandler.Invoke(backendlessFault); } } } WriteToStream(method, uri, headers, data, ostream); response = new SocketResponse(); response.ReadFromStream(ostream); } client.Close(); switch (response.status) { case 307: case 302: case 301: uri = new Uri(response.GetHeader("Location")); continue; default: retry = maximumRetryCount; break; } } } catch (System.Exception ex) { BackendlessFault backendlessFault = new BackendlessFault(ex); if (callback != null) { callback.ErrorHandler.Invoke(backendlessFault); } } if (response.status == 200) { T result = default(T); string responseJsonString = response.response; if ((api >= Api.COUNTERSERVICE_GET && api <= Api.COUNTERSERVICE_COM_SET) || api == Api.CACHESERVICE_CONTAINS) { result = (T)Convert.ChangeType(responseJsonString, typeof(T)); } else { if (string.IsNullOrEmpty(responseJsonString) == false) { result = JsonMapper.ToObject <T>(responseJsonString); } } if (callback != null) { callback.ResponseHandler.Invoke(result); } } else { BackendlessFault fault = null; try { JsonData errorResponse = JsonMapper.ToObject(response.response); int code = (int)errorResponse["code"]; string message = (string)errorResponse["message"]; fault = new BackendlessFault(code.ToString(), message, null); } catch (System.Exception ex) { fault = new BackendlessFault(ex); } if (callback != null) { callback.ErrorHandler.Invoke(fault); } } })); }