2

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

我有 WCF 客户端和服务,TransferMode = Streamed 双方。基本的HttpBinding。客户端向服务发送 Stream 对象,服务读取流并将其写入他创建的新文件中。客户端发送我创建的流的子类:从FileStream继承的FileStreamEx

我把这个类放在那个命名空间中,这样我就可以在每次服务调用“读取”方法时观看。

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 。如果您查看下面的代码,您会看到每次读取的我的缓冲区 arr 大小仅为 1024!按逻辑,在 MyStream.Read(buffer, 0, bufferSize)) 之后,我的“读取”方法需要开始,但事实并非如此,“读取”方法随机启动(或者不是,我无法理解),当我的'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;
                }
            }
        }

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

但在我的逻辑中,这段代码的输出需要从一开始:

阅读:1024

阅读:1024

阅读:1024

阅读:1024

阅读:1024

阅读:1024

...

..

.

但它不是出局!我的错误在哪里?甚至有什么误会吗?

4

1 回答 1

1

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

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

于 2012-05-14T15:57:52.833 回答