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); }