예제 #1
0
        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;
        }
예제 #2
0
        /// <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();
                }
            }
        }
예제 #3
0
        /// <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();
            }
        }