/// <summary> /// Executa a requisição de modo assíncrono utilizando o método HTTP enviado e retorna o resultado a partir dos delegates de callback. Esse overload tem suporte a track de porcentagem de upload /// </summary> /// <param name="method">Método HTTP a ser utilizado para fazer a requisição</param> /// <param name="sucessResultWithStreamHandler">Handler chamado quando houver sucesso na requisição</param> /// <param name="progressChangedHandler">Handler chamado para notificar o progresso de upload da requisição</param> /// <param name="errorResultHandler">Handler chamado quando houver erro na requisição</param> /// <owner>Mnix-Victor</owner> public void ExecuteAsync(HttpMethod method, SuccessResultHandler successResultHandler, UploadProgressChangedHandler progressChangedHandler, ErrorResultHandler errorResultHandler) { if (method == HttpMethod.GET && progressChangedHandler != null) { throw new InvalidHTTPMethodForProgressTrackingException(method); } this._mIsRequestRunning = true; Thread newThread = new Thread(delegate() { try { Stream responseStream = MakeRequest(method, progressChangedHandler); string resultString = MountReturnString(responseStream); responseStream.Close(); successResultHandler.Invoke(this, resultString); } catch (WebException webException) { this.DiagnoseRequestErrors(webException, errorResultHandler); } finally { this._mIsRequestRunning = false; } }); newThread.Start(); }
/// <summary> /// Trata os erros enviados pela exception e disparada o delegate de erro /// </summary> /// <owner>Mnix-Victor</owner> private void DiagnoseRequestErrors(WebException exception, ErrorResultHandler errorResultHandler) { string errorOutput = String.Empty; WebResponse response = exception.Response; if (response != null) { StreamReader errorStreamReader = new StreamReader(exception.Response.GetResponseStream()); errorOutput = errorStreamReader.ReadToEnd(); } errorResultHandler.Invoke(this, exception, errorOutput); }