首先,我尽可能简单地告诉你,用简单的话说,当我在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
...
...
但它不是出来的!我的错误在哪里?甚至有任何错误吗?
答案 0 :(得分:1)
服务器和客户端可能(并且可能)在读取数据时使用不同的缓冲区大小。你的代码本身并没有什么不妥。
如果要强制客户端使用较小的缓冲区,可以考虑使用绑定的传输模式Streamed
,并使用较小的值作为绑定的MaxBufferSize
属性(如果你'使用自定义绑定,这些属性可能会在传输绑定元素上。)