首先,我把我的问题尽可能简单地告诉你,简单地说,当我在 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
...
..
.
但它不是出局!我的错误在哪里?甚至有什么误会吗?