Esempio n. 1
0
        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);
                    }
                }
            }));
        }