예제 #1
0
        public void StartHandleResponseBody(Stream inputStream, EndResponseBody endResponseBody)
        {
            ResponseBodyState responseBodyState = new ResponseBodyState();

            responseBodyState.inputStream     = inputStream;
            responseBodyState.endResponseBody = endResponseBody;
            responseBodyState.completed       = 0L;

            try
            {
                int count = (int)((contentLength > SEGMENT_SIZE || contentLength <= 0) ? SEGMENT_SIZE : contentLength);

                byte[] buffer = new byte[count];

                responseBodyState.buffer = buffer;

                if (isDownload)
                {
                    if (File.Exists(filePath) && new FileInfo(filePath).Length > fileOffset)
                    {
                        // 写脏文件了,直接 Truncate
                        fileStream = new FileStream(filePath, FileMode.Truncate, FileAccess.Write);
                    }
                    else
                    {
                        // 正常文件或者追加写场景,直接写入
                        fileStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write);
                    }
                    fileStream.Seek(fileOffset, SeekOrigin.Begin);
                    responseBodyState.inputStream.BeginRead(responseBodyState.buffer, 0, responseBodyState.buffer.Length, AsyncStreamCallback, responseBodyState);
                }
                else
                {
                    memoryStream             = new MemoryStream(count);
                    responseBodyState.buffer = buffer;
                    responseBodyState.inputStream.BeginRead(responseBodyState.buffer, 0, responseBodyState.buffer.Length, AsyncStreamCallback, responseBodyState);
                }
            }
            catch (Exception ex)
            {
                if (fileStream != null)
                {
                    fileStream.Close();
                    fileStream.Dispose();
                }

                if (memoryStream != null)
                {
                    memoryStream.Close();
                    memoryStream.Dispose();
                }

                responseBodyState.endResponseBody(false, ex);
                responseBodyState.Clear();

                QLog.Error("ResponseBody", ex.Message, ex);
            }
        }
        private void AsyncStreamCallback(IAsyncResult ar)
        {
            ResponseBodyState responseBodyState = ar.AsyncState as ResponseBodyState;
            Stream            inputStream       = responseBodyState.inputStream;

            try
            {
                int recvLen = inputStream.EndRead(ar);
                responseBodyState.completed += recvLen;
                if (recvLen > 0)
                {
                    if (isDownload)
                    {
                        fileStream.Write(responseBodyState.buffer, 0, recvLen);
                        if (progressCallback != null)
                        {
                            progressCallback(responseBodyState.completed, contentLength);
                        }
                    }
                    else
                    {
                        memoryStream.Write(responseBodyState.buffer, 0, recvLen);
                    }

                    inputStream.BeginRead(responseBodyState.buffer, 0, responseBodyState.buffer.Length, AsyncStreamCallback, responseBodyState);
                }
                else if (recvLen == 0)
                {
                    if (isDownload)
                    {
                        fileStream.Flush();
                    }
                    else
                    {
                        memoryStream.Seek(0, SeekOrigin.Begin);
                        parseStream(memoryStream, contentType, responseBodyState.completed);
                    }

                    responseBodyState.endResponseBody(true, null);
                    responseBodyState.Clear();
                    if (fileStream != null)
                    {
                        fileStream.Close();
                        fileStream.Dispose();
                    }
                    if (memoryStream != null)
                    {
                        memoryStream.Close();
                        memoryStream.Dispose();
                    }
                }
            }
            catch (Exception ex)
            {
                responseBodyState.endResponseBody(false, ex);
                responseBodyState.Clear();
                if (fileStream != null)
                {
                    fileStream.Close();
                    fileStream.Dispose();
                }
                if (memoryStream != null)
                {
                    memoryStream.Close();
                    memoryStream.Dispose();
                }
                QLog.E("ResponseBody", ex.Message, ex);
            }
        }
예제 #3
0
        private void AsyncStreamCallback(IAsyncResult ar)
        {
            ResponseBodyState responseBodyState = ar.AsyncState as ResponseBodyState;

            Stream inputStream = responseBodyState.inputStream;

            try
            {
                int recvLen = inputStream.EndRead(ar);

                responseBodyState.completed += recvLen;

                if (recvLen > 0)
                {
                    if (isDownload)
                    {
                        fileStream.Write(responseBodyState.buffer, 0, recvLen);

                        if (progressCallback != null)
                        {
                            progressCallback(responseBodyState.completed, contentLength);
                        }
                    }
                    else
                    {
                        memoryStream.Write(responseBodyState.buffer, 0, recvLen);
                    }

                    inputStream.BeginRead(responseBodyState.buffer, 0, responseBodyState.buffer.Length, AsyncStreamCallback, responseBodyState);
                }
                else
                if (recvLen == 0)
                {
                    if (isDownload)
                    {
                        fileStream.Flush();
                    }
                    else
                    {
                        if ("application/xml".Equals(contentType, StringComparison.OrdinalIgnoreCase) &&
                            memoryStream.Length > 0 && memoryStream.Length < 10 * 1000)
                        {
                            memoryStream.Seek(0, SeekOrigin.Begin);
                            rawContentBodyString = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray());
                        }

                        memoryStream.Seek(0, SeekOrigin.Begin);
                        parseStream(memoryStream, contentType, responseBodyState.completed);
                    }

                    responseBodyState.endResponseBody(true, null);
                    responseBodyState.Clear();

                    if (fileStream != null)
                    {
                        fileStream.Close();
                        fileStream.Dispose();
                    }

                    if (memoryStream != null)
                    {
                        memoryStream.Close();
                        memoryStream.Dispose();
                    }
                }
            }
            catch (Exception ex)
            {
                responseBodyState.endResponseBody(false, ex);
                responseBodyState.Clear();

                if (fileStream != null)
                {
                    fileStream.Close();
                    fileStream.Dispose();
                }

                if (memoryStream != null)
                {
                    memoryStream.Close();
                    memoryStream.Dispose();
                }

                QLog.Error("ResponseBody", ex.Message, ex);
            }
        }