WCF -Stream.Read - Bug?

时间:2012-05-14 15:50:26

标签: c# wcf filestream

首先,我尽可能简单地告诉你,用简单的话说,当我在wcf中转换流对象时,方法'Read'不关心我给他的任何参数。

我有WCF客户端& service,TransferMode =双方流式传输。 basicHttpBinding的。 客户端向服务发送Stream对象,服务读取流并将其写入他创建的新文件。 客户端发送我创建的流的子类: FileStreamEx ,它继承自 FileStream

我在该命名空间中使用了这个类,所以每次服务调用'Read'方法都可以看到。

namespace ConsoleApplication1
{
    /// <summary>
    /// The only thing I gain from this class is to know how much was read after every time I call "Read" method
    /// </summary>
    public class FileStreamEx : FileStream
    {
        /// <summary>
        /// how much was read until now
        /// </summary>
        public long _ReadUntilNow { get; private set; }
        public FileStreamEx(string path, FileMode mode, FileAccess access, FileShare share)
            : base(path, mode, access, share)
        {
            this._ReadUntilNow = 0;
        }
        public override int Read(byte[] array, int offset, int count)
        {
            int ReturnV = base.Read(array, offset, count);
            _ReadUntilNow += ReturnV;
            Console.WriteLine("Read: " + _ReadUntilNow);//Show how much was read until now
            return ReturnV;
        }
    }
    public class Program
    {
        static void Main(string[] args)
        {
            ServiceReference1.IJob Service1 = new ServiceReference1.JobClient();
            string FileName = "Chat.rar";
            string Path = @"C:\Uploadfiles\";
            FileStreamEx TheStream = new FileStreamEx(Path + FileName, FileMode.Open, FileAccess.Read, FileShare.None);
            Service1.UselessMethod1(TheStream);
        }
    }
}

直到现在还没有什么复杂的。下面是UselessMethod1方法代码。 但问题是,问题已经开始了:在我调用Service1.UselessMethod1(TheStream)后,Insted转到UselessMethod1方法,'Read'方法开始3次,无论文件的大小和输出是什么(仅在客户端):

阅读:256

阅读:4352

阅读:69888

仅在'Read'方法被调用3次后,UselessMethod1 Begin 。 如果你看下面的代码,你会看到每个Read的My buffer arr大小只有1024! 通过逻辑,在MyStream.Read(buffer,0,bufferSize)之后,我的'Read'方法需要开始,但事实并非如此,'Read'方法开始randomaly (或者不是,我不能理解它)当我的'Read'方法开始时,我的'Read'方法所具有的参数'byte [] array'的Arr的长度在被调用时从不是1024.

public void UselessMethod1(Stream MyStream)
        {
            using (FileStream fs = new FileStream(@"C:\Upload\"+"Chat.rar", FileMode.Create))
            {
                int bufferSize = 1024 ;
                byte[] buffer = new byte[bufferSize];
                int totalBytes = 0;
                int bytes = 0;
                while ((bytes = MyStream.Read(buffer, 0, bufferSize)) > 0)
                {
                    fs.Write(buffer, 0, bytes);
                    fs.Flush();
                    totalBytes += bytes;
                }
            }
        }

此代码中的一些输出是: (Sory我不明白如何显示图像) http://desmond.imageshack.us/Himg36/scaled.php?server=36&filename=prlbem.jpg&res=landing

但在我的逻辑中,这段代码的输出必须从一开始就是:

阅读:1024

阅读:1024

阅读:1024

阅读:1024

阅读:1024

阅读:1024

...

...

但它不是出来的!我的错误在哪里?甚至有任何错误吗?

1 个答案:

答案 0 :(得分:1)

服务器和客户端可能(并且可能)在读取数据时使用不同的缓冲区大小。你的代码本身并没有什么不妥。

如果要强制客户端使用较小的缓冲区,可以考虑使用绑定的传输模式Streamed,并使用较小的值作为绑定的MaxBufferSize属性(如果你'使用自定义绑定,这些属性可能会在传输绑定元素上。)