예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="inputStream"></param>
        /// <param name="outputStream"></param>
        /// <param name="mode"></param>
        public void ProcessStream(Stream inputStream, Stream outputStream, StreamProcessMode mode)
        {
            // 当输入流不可读时应该抛出异常终止程序。

            if (!inputStream.CanRead)
            {
                throw new NotSupportedException("Input stream not support reading");
            }

            // 当输出流不可写时应该抛出异常终止程序。

            if (!outputStream.CanWrite)
            {
                throw new NotSupportedException("Output stream not support writting");
            }

            long outputStreamCurrentPosition = 0;

            if (outputStream.CanSeek)
            {
                outputStreamCurrentPosition = outputStream.Position;
            }

            // 将上一个输出流(上一个SOAP扩展的输出流就是当前SOAP扩展的输入流)复位再后读取经过上一个SOAP扩展解析的数据流。

            if (inputStream.CanSeek)
            {
                inputStream.Position = 0;
            }

            byte[] buffer = new byte[BufferSize];

            try
            {
                ProcessModeStream(inputStream, outputStream, mode, buffer);
            }
            catch (Exception ex)
            {
                throw new ApplicationException("数据处理错误 : " + ex.Message, ex);
            }
            finally
            {
                // 在整个数据流链表中,必需手动关闭输入流,但不能关闭输出流。
                inputStream.Close();

                /* 当优先级最低的SOAP扩展(即最后一个过滤处理器)在处理完从网络中接收过来的数据时,
                 * 必需将输出流复位到经当前SOAP扩展处理后前的位置上,否则系统从这个流中读取数据时
                 * 必定遇到EOF异常。
                 * */
                if (outputStream.CanSeek)
                {
                    outputStream.Position = outputStreamCurrentPosition;
                }
            }
        }
예제 #2
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="inputStream"></param>
 /// <param name="outputStream"></param>
 /// <param name="mode"></param>
 protected abstract void ProcessModeStream(Stream inputStream, Stream outputStream, StreamProcessMode mode, byte[] buffer);
예제 #3
0
 /// <summary>
 /// 集中处理所有数据流的压缩或者解压缩,具体的压缩和解压功能
 /// 在具体的子类中通过重写CompressStream和DecompressStream
 /// 方法来实现。
 /// </summary>
 /// <param name="inputStream"></param>
 /// <param name="outputStream"></param>
 /// <param name="mode"></param>
 /// <param name="buffer"></param>
 protected override void ProcessModeStream(Stream inputStream, Stream outputStream, StreamProcessMode mode, byte[] buffer)
 {
     if (mode == StreamProcessMode.Compress)
     {
         CompressStream(inputStream, outputStream, buffer);
     }
     else if (mode == StreamProcessMode.Decompress)
     {
         DecompressStream(inputStream, outputStream, buffer);
     }
     else
     {
         throw new NotSupportedException("Not support compression mode");
     }
 }