static void UploadDataCallback(IAsyncResult result) { //结束异步写入 UploadDataState state = result.AsyncState as UploadDataState; Stream stream = state.RequestStream; try { stream.EndWrite(result); stream.Close(); } catch (Exception ex) { // } state.Finished = true; }
/// <summary> /// Post数据到Rovio上。 /// Rovio 为HTTP 1.0版本,不支持分块上传。 /// </summary> /// <param name="cmd"></param> /// <param name="audio"></param> public void UploadData(string cmd, byte[] audio, int offset, int length, int timeout = 30000, BackgroundWorker bw = null) { Uri targetUri = new Uri(new Uri(this.rovioAddress), cmd); HttpWebRequest request = null; try { request = WebRequest.Create(targetUri) as HttpWebRequest; request.Credentials = this.rovioCredentials; request.AllowWriteStreamBuffering = true; request.Timeout = timeout; request.Method = WebRequestMethods.Http.Post; request.ContentType = "application/x-www-form-urlencoded"; //务必设置false,否则连接会一直占用 request.KeepAlive = false; request.ContentLength = length; //Stopwatch stopwatch = new Stopwatch(); //stopwatch.Start(); Stream requestStream = request.GetRequestStream(); //Debug.WriteLine("请求耗时:" + stopwatch.ElapsedMilliseconds); //启动异步写入 UploadDataState state = new UploadDataState(requestStream); IAsyncResult result = requestStream.BeginWrite(audio, offset, length, UploadDataCallback, state); while (!state.Finished) { if (bw != null && bw.CancellationPending) { try { requestStream.EndWrite(result); requestStream.Close(); } catch (Exception ex) { // } break; } } //Debug.WriteLine("写入耗时:" + stopwatch.ElapsedMilliseconds); // 获取响应,但Rovio必然会断开连接 HttpWebResponse response = null; try { response = request.GetResponse() as HttpWebResponse; } catch (WebException ex) { switch (ex.Status) { case WebExceptionStatus.KeepAliveFailure: case WebExceptionStatus.ConnectionClosed: //Rovio对该请求无响应,忽略此错误 break; default: throw ex; } } finally { if (response != null) { response.Close(); } } //Debug.WriteLine("关闭耗时:" + stopwatch.ElapsedMilliseconds); } catch (WebException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { if (request != null) { request.Abort(); } } }
/// <summary> /// Post数据到Rovio上。 /// Rovio 为HTTP 1.0版本,不支持分块上传。 /// </summary> /// <param name="cmd"></param> /// <param name="audio"></param> public void UploadData(string cmd, byte[] audio, int offset, int length, int timeout = 30000, BackgroundWorker bw = null) { Uri targetUri = new Uri(new Uri(this.rovioAddress), cmd); HttpWebRequest request = null; try { request = WebRequest.Create(targetUri) as HttpWebRequest; request.Credentials = this.rovioCredentials; request.AllowWriteStreamBuffering = true; request.Timeout = timeout; request.Method = WebRequestMethods.Http.Post; request.ContentType = "application/x-www-form-urlencoded"; //务必设置false,否则连接会一直占用 request.KeepAlive = false; request.ContentLength = length; //Stopwatch stopwatch = new Stopwatch(); //stopwatch.Start(); Stream requestStream = request.GetRequestStream(); //Debug.WriteLine("请求耗时:" + stopwatch.ElapsedMilliseconds); //启动异步写入 UploadDataState state = new UploadDataState(requestStream); IAsyncResult result = requestStream.BeginWrite(audio, offset, length, UploadDataCallback, state); while (!state.Finished) { if (bw != null && bw.CancellationPending) { try { requestStream.EndWrite(result); requestStream.Close(); } catch (Exception ex) { // } break; } } //Debug.WriteLine("写入耗时:" + stopwatch.ElapsedMilliseconds); // 获取响应,但Rovio必然会断开连接 HttpWebResponse response = null; try { response = request.GetResponse() as HttpWebResponse; } catch (WebException ex) { switch (ex.Status) { case WebExceptionStatus.KeepAliveFailure: case WebExceptionStatus.ConnectionClosed: //Rovio对该请求无响应,忽略此错误 break; default: throw ex; } } finally { if (response != null) response.Close(); } //Debug.WriteLine("关闭耗时:" + stopwatch.ElapsedMilliseconds); } catch (WebException ex) { throw ex; } catch (Exception ex) { throw ex; } finally { if(request != null) request.Abort(); } }