Beispiel #1
0
        /// <summary>
        /// Send JSON message asyncronously over http request.
        /// </summary>
        /// <typeparam name="T">JSON message type.</typeparam>
        /// <param name="request">Request to send.</param>
        /// <param name="onDone"></param>
        /// <param name="onError"></param>
        public void GetAsync <T>(IGXRequest <T> request, DoneEventHandler onDone, ErrorEventHandler onError)
        {
            GXAsyncData <T> data = new GXAsyncData <T>();

            data.OnError = onError;
            data.OnDone  = onDone;
            HttpWebRequest req = Send <T>("GET", request, data);
        }
Beispiel #2
0
        /// <summary>
        /// Send JSON message asyncronously over http request.
        /// </summary>
        /// <typeparam name="T">JSON message type.</typeparam>
        /// <param name="request">Request to send.</param>
        /// <param name="onDone"></param>
        /// <param name="onError"></param>
        public void PostAsync <T>(IGXRequest <T> request, DoneEventHandler onDone, ErrorEventHandler onError)
        {
            GXAsyncData <T> data = new GXAsyncData <T>();

            data.OnError = onError;
            data.OnDone  = onDone;
            Send <T>("POST", request, data);
        }
        /// <summary>
        /// Send http message asyncronously.
        /// </summary>
        /// <typeparam name="T">JSON message type.</typeparam>
        /// <param name="asyncResult">Http stream.</param>
        private void AsyncReponse <T>(IAsyncResult asyncResult)
        {
            GXAsyncData <T> data = (GXAsyncData <T>)asyncResult.AsyncState;
            WebResponse     res  = data.Request.EndGetResponse(asyncResult);
            T result             = GetResponse <T>(res);

            data.OnDone?.Invoke(this, result);
        }
Beispiel #4
0
        private void SendAsync <T>(IAsyncResult result)
        {
            GXAsyncData <T> data = (GXAsyncData <T>)result.AsyncState;

            using (Stream stream = data.Request.EndGetRequestStream(result))
            {
                using (var streamWriter = new StreamWriter(stream))
                {
                    streamWriter.Write(data.Data);
                    streamWriter.Flush();
                }
            }
            data.Request.BeginGetResponse(AsyncReponse <T>, data);
        }
Beispiel #5
0
        /// <summary>
        /// Parse to JSON and send to the server.
        /// </summary>
        /// <typeparam name="T">JSON message type.</typeparam>
        /// <param name="method">Sent JSON object as a string.</param>
        /// <param name="request">Request to send.</param>
        /// <param name="data">Async request.</param>
        /// <returns>Http request that is sent to the server.</returns>
        private HttpWebRequest Send <T>(string method, object request, GXAsyncData <T> data)
        {
            CancelOperation = false;
            string cmd     = null;
            bool   content = method == "POST" || method == "PUT";

            //Serialize to string because we want to know length.
            using (TextWriter writer = new StringWriter())
            {
                Parser.Serialize(request, writer, true, !content, false, false);
                cmd = writer.ToString();
            }
            HttpWebRequest req;

            if (content)//If POST or PUT.
            {
                req = WebRequest.Create(Address + request.GetType().Name) as HttpWebRequest;
            }
            else //If GET or DELETE.
            {
                req = WebRequest.Create(Address + request.GetType().Name + "?" + cmd) as HttpWebRequest;
            }
            if (Timeout.TotalMilliseconds != 0)
            {
                req.ReadWriteTimeout = req.Timeout = (int)this.Timeout.TotalMilliseconds;
            }
            req.ContentType = "application/json";
            req.Accept      = "application/json";
            req.Method      = method;
            if (trace != null)
            {
                trace(this, new TraceEventArgs(TraceTypes.Sent, content ? cmd : null, req.Address.ToString()));
            }
            //Add basic authentication if it is used.
            if (!string.IsNullOrEmpty(UserName))
            {
                req.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(UserName + ":" + Password)));
            }
            if (content)
            {
                req.ContentLength = cmd.Length;
                //If data is send as async.
                if (data != null)
                {
                    data.Data    = cmd;
                    data.Request = req;
                    req.BeginGetRequestStream(delegate(IAsyncResult result)
                    {
                        lock (asyncOperations)
                        {
                            asyncOperations.Add(result.AsyncWaitHandle);
                        }
                        GXAsyncData <T> tmp = (GXAsyncData <T>)result.AsyncState;
                        try
                        {
                            using (Stream stream = tmp.Request.EndGetRequestStream(result))
                            {
                                using (var streamWriter = new StreamWriter(stream))
                                {
                                    streamWriter.Write(tmp.Data);
                                    streamWriter.Flush();
                                }
                            }
                            tmp.Request.BeginGetResponse(AsyncReponse <T>, tmp);
                        }
                        catch (Exception ex)
                        {
                            tmp.OnError(this, ex);
                        }
                        finally
                        {
                            lock (asyncOperations)
                            {
                                asyncOperations.Remove(result.AsyncWaitHandle);
                            }
                        }
                    }, data);
                }
                else
                {
                    using (var streamWriter = new StreamWriter(req.GetRequestStream()))
                    {
                        streamWriter.Write(cmd);
                        streamWriter.Flush();
                    }
                }
            }
            else if (data != null)
            {
                req.BeginGetResponse(delegate(IAsyncResult result)
                {
                    lock (asyncOperations)
                    {
                        asyncOperations.Add(result.AsyncWaitHandle);
                    }
                    GXAsyncData <T> tmp = (GXAsyncData <T>)result.AsyncState;
                    try
                    {
                        T result2 = GetResponse <T>(req);
                        if (data.OnDone != null)
                        {
                            data.OnDone(this, result2);
                        }
                    }
                    catch (Exception ex)
                    {
                        tmp.OnError(this, ex);
                    }
                    finally
                    {
                        lock (asyncOperations)
                        {
                            asyncOperations.Remove(result.AsyncWaitHandle);
                        }
                    }
                }, data);
            }
            return(req);
        }
Beispiel #6
0
        /// <summary>
        /// Parse to JSON and send to the server.
        /// </summary>
        /// <typeparam name="T">JSON message type.</typeparam>
        /// <param name="route">Additional route.</param>
        /// <param name="method">Sent JSON object as a string.</param>
        /// <param name="request">Request to send.</param>
        /// <param name="data">Async request.</param>
        /// <returns>Http request that is sent to the server.</returns>
        private HttpWebRequest Send <T>(string route, string method, object request, GXAsyncData <T> data)
        {
            CancelOperation = false;
            string cmd     = null;
            bool   content = method == "POST" || method == "PUT";

            //Serialize to string because we want to know length.
            using (TextWriter writer = new StringWriter())
            {
                Parser.Serialize(request, writer, true, !content, false, false);
                cmd = writer.ToString();
            }
            if (string.IsNullOrEmpty(route))
            {
                route = request.GetType().Name;
            }
            if (route[0] != '/' && Address[Address.Length - 1] != '/')
            {
                route = "/" + route;
            }
            HttpWebRequest req;

            if (content)//If POST or PUT.
            {
                req = WebRequest.Create(Address + route) as HttpWebRequest;
            }
            else //If GET or DELETE.
            {
                req = WebRequest.Create(Address + route + "?" + cmd) as HttpWebRequest;
            }
#if !NET35
            if (Date != DateTime.MinValue && Date != DateTime.MaxValue)
            {
                req.Date = Date.ToUniversalTime();
            }
#endif //!NET35
            req.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.BypassCache);
            req.Headers.Add("Cache-Control", "no-cache");
            if (Timeout.TotalMilliseconds != 0)
            {
                req.ReadWriteTimeout = req.Timeout = (int)this.Timeout.TotalMilliseconds;
            }
            req.ContentType = "application/json";
            req.Accept      = "application/json";
            req.Method      = method;
            if (trace != null)
            {
                trace(this, new TraceEventArgs(TraceTypes.Sent, content ? cmd : null, req.Address.ToString()));
            }
            //Add basic authentication if it is used.
            if (!string.IsNullOrEmpty(UserName))
            {
                req.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(UserName + ":" + Password)));
            }
            //Data must serialize because data might be non-ASCII.
            byte[] d;
            using (MemoryStream ms = new MemoryStream())
            {
                using (var sw = new StreamWriter(ms))
                {
                    sw.Write(cmd);
                    sw.Flush();
                    d           = new byte[ms.Position];
                    ms.Position = 0;
                    ms.Read(d, 0, d.Length);
                }
            }
            if (content)
            {
                req.ContentLength = d.Length;
                //If data is send as async.
                if (data != null)
                {
                    data.Data    = d;
                    data.Request = req;
                    req.BeginGetRequestStream(delegate(IAsyncResult result)
                    {
                        lock (asyncOperations)
                        {
                            asyncOperations.Add(result.AsyncWaitHandle);
                        }
                        GXAsyncData <T> tmp = (GXAsyncData <T>)result.AsyncState;
                        try
                        {
                            using (Stream stream = tmp.Request.EndGetRequestStream(result))
                            {
                                using (var streamWriter = new StreamWriter(stream))
                                {
                                    streamWriter.Write(tmp.Data);
                                    streamWriter.Flush();
                                }
                            }
                            tmp.Request.BeginGetResponse(AsyncReponse <T>, tmp);
                        }
                        catch (Exception ex)
                        {
                            tmp.OnError(this, ex);
                        }
                        finally
                        {
                            lock (asyncOperations)
                            {
                                asyncOperations.Remove(result.AsyncWaitHandle);
                            }
                        }
                    }, data);
                }
                else
                {
                    using (BufferedStream bs = new BufferedStream(req.GetRequestStream()))
                    {
                        bs.Write(d, 0, d.Length);
                        bs.Flush();
                    }
                }
            }
            else if (data != null)
            {
                data.Data = d;
                req.BeginGetResponse(delegate(IAsyncResult result)
                {
                    lock (asyncOperations)
                    {
                        asyncOperations.Add(result.AsyncWaitHandle);
                    }
                    GXAsyncData <T> tmp = (GXAsyncData <T>)result.AsyncState;
                    try
                    {
                        T result2 = GetResponse <T>(req);
                        if (data.OnDone != null)
                        {
                            data.OnDone(this, result2);
                        }
                    }
                    catch (Exception ex)
                    {
                        tmp.OnError(this, ex);
                    }
                    finally
                    {
                        lock (asyncOperations)
                        {
                            asyncOperations.Remove(result.AsyncWaitHandle);
                        }
                    }
                }, data);
            }
            return(req);
        }
        /// <summary>
        /// Parse to JSON and send to the server.
        /// </summary>
        /// <typeparam name="T">JSON message type.</typeparam>
        /// <param name="method">Sent JSON object as a string.</param>
        /// <param name="request">Request to send.</param>
        /// <param name="data">Async request.</param>
        /// <returns>Http request that is sent to the server.</returns>
        private HttpWebRequest Send <T>(string method, object request, GXAsyncData <T> data)
        {
            CancelOperation = false;
            string cmd     = null;
            bool   content = method == "POST" || method == "PUT";

            //Serialize to string because we want to know length.
            using (TextWriter writer = new StringWriter())
            {
                Parser.Serialize(request, writer, true, !content, false, false);
                cmd = writer.ToString();
            }
            HttpWebRequest req;

            if (content)//If POST or PUT.
            {
                req = WebRequest.Create(Address + "json/reply/" + request.GetType().Name) as HttpWebRequest;
            }
            else //If GET or DELETE.
            {
                req = WebRequest.Create(Address + "json/reply/" + request.GetType().Name + "?" + cmd) as HttpWebRequest;
            }
            if (this.Timeout.TotalMilliseconds != 0)
            {
                req.Timeout = (int)this.Timeout.TotalMilliseconds;
            }
            req.ContentType = "application/json; charset=utf-8";
            req.Accept      = "text/json";
            req.Method      = method;
            //Add basic authentication if it is used.
            if (!string.IsNullOrEmpty(UserName))
            {
                req.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(UserName + ":" + Password)));
            }
            if (content)
            {
                req.ContentLength = cmd.Length;
                if (data != null)
                {
                    System.Threading.AutoResetEvent sent = new System.Threading.AutoResetEvent(false);
                    data.Data    = cmd;
                    data.Request = req;
                    //req.BeginGetRequestStream(SendAsync<T>, data);
                    req.BeginGetRequestStream(delegate(IAsyncResult result)
                    {
                        GXAsyncData <T> tmp = (GXAsyncData <T>)result.AsyncState;
                        using (Stream stream = tmp.Request.EndGetRequestStream(result))
                        {
                            using (var streamWriter = new StreamWriter(stream))
                            {
                                streamWriter.Write(tmp.Data);
                                streamWriter.Flush();
                            }
                        }
                        sent.Set();
                        tmp.Request.BeginGetResponse(AsyncReponse <T>, tmp);
                    }, data);
                    sent.WaitOne();
                }
                else
                {
                    using (var streamWriter = new StreamWriter(req.GetRequestStream()))
                    {
                        streamWriter.Write(cmd);
                        streamWriter.Flush();
                    }
                }
            }
            return(req);
        }