private void BeginGetRequestStreamCallback(IAsyncResult asyncResult)
        {
            Stream requestStream = null;
            HttpWebRequestAsyncState asyncState = null;

            try
            {
                asyncState    = (HttpWebRequestAsyncState)asyncResult.AsyncState;
                requestStream = asyncState.HttpWebRequest.EndGetRequestStream(asyncResult);
                requestStream.Write(asyncState.RequestBytes, 0, asyncState.RequestBytes.Length);
                requestStream.Close();
                IAsyncResult result = asyncState.HttpWebRequest.BeginGetResponse(BeginGetResponseCallback,
                                                                                 new HttpWebRequestAsyncState
                {
                    HttpWebRequest   = asyncState.HttpWebRequest,
                    ResponseCallback = asyncState.ResponseCallback,
                    State            = asyncState.State
                });



                // Timeout comes here
                ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(TimeOutCallback), asyncState.HttpWebRequest, 30000, true);
            }
            catch (Exception ex)
            {
                if (asyncState != null)
                {
                    asyncState.ResponseCallback(new HttpWebRequestCallbackState(ex));
                }
                else
                {
                    throw;
                }
            }
            finally
            {
                if (requestStream != null)
                {
                    requestStream.Close();
                }
            }
        }
        private void BeginGetResponseCallback(IAsyncResult asyncResult)
        {
            WebResponse webResponse             = null;
            Stream      responseStream          = null;
            HttpWebRequestAsyncState asyncState = null;

            try
            {
                asyncState     = (HttpWebRequestAsyncState)asyncResult.AsyncState;
                webResponse    = asyncState.HttpWebRequest.EndGetResponse(asyncResult);
                responseStream = webResponse.GetResponseStream();
                var webRequestCallbackState = new HttpWebRequestCallbackState(responseStream, asyncState.State);
                asyncState.ResponseCallback(webRequestCallbackState);
                responseStream.Close();
                responseStream = null;
                webResponse.Close();
                webResponse = null;
            }
            catch (Exception ex)
            {
                if (asyncState != null)
                {
                    asyncState.ResponseCallback(new HttpWebRequestCallbackState(ex));
                }
                else
                {
                    throw;
                }
            }
            finally
            {
                if (responseStream != null)
                {
                    responseStream.Close();
                }
                if (webResponse != null)
                {
                    webResponse.Close();
                }
            }
        }
        /// <summary>
        /// This method does an Http POST sending any post parameters to the url provided
        /// </summary>
        /// <param name="url">The url to make an Http POST to</param>
        /// <param name="postParameters">The form parameters if any that need to be POSTed</param>
        /// <param name="responseCallback">The callback delegate that should be called when the response returns from the remote server</param>
        /// <param name="state">Any state information you need to pass along to be available in the callback method when it is called</param>
        /// <param name="contentType">The Content-Type of the Http request</param>
        public void PostAsync(string url, NameValueCollection postParameters, Action <HttpWebRequestCallbackState> responseCallback)
        {
            object state          = null;
            string contentType    = "application/x-www-form-urlencoded";
            var    httpWebRequest = CreateHttpWebRequest(url, "POST", contentType);
            var    requestBytes   = GetRequestBytes(postParameters);

            httpWebRequest.ContentLength = requestBytes.Length;

            HttpWebRequestAsyncState httpWebRequestAsyncState = new HttpWebRequestAsyncState()
            {
                RequestBytes     = requestBytes,
                HttpWebRequest   = httpWebRequest,
                ResponseCallback = responseCallback,
                State            = state
            };

            IAsyncResult result = httpWebRequest.BeginGetRequestStream(BeginGetRequestStreamCallback, httpWebRequestAsyncState);

            m_requestState = httpWebRequestAsyncState;

            ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(TimeOutCallback), httpWebRequest, 30000, true);
        }