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); } }
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); } }