/// <summary> /// Post one or more MIME parts to a URI /// </summary> /// <param name="uri">The URI of the web service to receive the Http post message</param> /// <param name="retries">Number of times to retry post if there is an error</param> /// <param name="mimeParts">MIME encoded payload</param> /// <param name="callback">Method called on failure or success that is passed an AsyncResult whose Result property is set to HttpResult</param> /// <returns>WebRequest IAsyncResult object</returns> public IAsyncResult Post(Uri uri, int retries, List<MimePart> mimeParts, AsyncCallback callback) { #if (SILVERLIGHT || WPF || TOOL) WebRequest webRequest = WebRequest.Create(uri); #else WebRequest webRequest = new UnityWebRequest(uri); #endif webRequest.Method = "POST"; IAsyncResult asyncResult = webRequest.BeginGetRequestStream((asynchronousResult) => { WebRequest request = (WebRequest)asynchronousResult.AsyncState; if (mimeParts.Count > 1) { CreateMultiPartRequest(request, asynchronousResult, mimeParts); } else { CreateSinglePartRequest(request, asynchronousResult, mimeParts[0]); } // Start the asynchronous operation to get the response request.BeginGetResponse((responseResult) => { bool retry = false; HttpResult httpResult = null; try { HttpWebResponse response = ((WebRequest)responseResult.AsyncState).EndGetResponse(responseResult) as HttpWebResponse; // Response stream is released when HttpResult is released httpResult = new HttpResult(response.GetResponseStream(), response.StatusCode, response.StatusDescription, response.ContentType); } catch (WebException we) { DebugLog.Error("WebException -> {0} '{1}' failed", webRequest.Method, uri.ToString()); DebugLog.Error(we.Message); if (retries > 0 && we.Status != WebExceptionStatus.RequestCanceled) { DebugLog.Info("Retry {0} '{1}'", webRequest.Method, uri.ToString()); Post(uri, --retries, mimeParts, callback); retry = true; } else { httpResult = new HttpResult(we); } } catch (Exception e) { DebugLog.Error("HTTP {0} '{1}' failed: {2}", webRequest.Method, uri.ToString(), e.Message); httpResult = new HttpResult(e); } finally { if (!retry && callback != null) { callback(new AsyncResult<HttpResult>(httpResult)); } } }, request); }, webRequest); return asyncResult; }
/// <summary> /// Get response stream from a web service indicated by URI /// </summary> /// <param name="uri">URI (path plus query string) to web service</param> /// <param name="retries">The number of times to retry get if it fails</param> /// <param name="callback">Method called on failure or success that is passed an AsyncResult whose Result property is set to HttpResult</param> /// <returns>WebRequest IAsyncResult object</returns> public IAsyncResult Get(Uri uri, int retries, AsyncCallback callback) { #if (SILVERLIGHT || WPF || TOOL) WebRequest webRequest = WebRequest.Create(uri); #else WebRequest webRequest = new UnityWebRequest(uri); #endif webRequest.Method = "GET"; IAsyncResult asyncResult = webRequest.BeginGetResponse((responseResult) => { bool retry = false; HttpResult httpResult = null; try { HttpWebResponse response = ((WebRequest)responseResult.AsyncState).EndGetResponse(responseResult) as HttpWebResponse; // Response stream is released when HttpResult is released httpResult = new HttpResult(response.GetResponseStream(), response.StatusCode, response.StatusDescription, response.ContentType); } catch (WebException we) { DebugLog.Error("WebException -> Get '{0}' failed", uri.ToString()); DebugLog.Error(we.Message); if (retries > 0 && we.Status != WebExceptionStatus.RequestCanceled) { DebugLog.Info("Retry Get '{0}'", uri.ToString()); Get(uri, --retries, callback); retry = true; } else { httpResult = new HttpResult(we); } } catch (Exception e) { DebugLog.Error("HTTP GET '{0}' failed: {1}", uri.ToString(), e.Message); httpResult = new HttpResult(e); } finally { if (!retry && callback != null) { callback(new AsyncResult<HttpResult>(httpResult)); } } }, webRequest); return asyncResult; }