gpt4 book ai didi

c# - WCF -Stream.Read - 错误?

转载 作者:太空宇宙 更新时间:2023-11-03 14:01:38 24 4
gpt4 key购买 nike

首先,我尽可能地简化了我的问题,以向您展示,简而言之,当我在 wcf 中传输流对象时,“读取”方法不关心我给他的任何参数。

我有 WCF 客户端和服务,TransferMode = Streamed 在双方。基本的HTTP绑定(bind)。客户端向服务发送一个 Stream 对象,服务读取该流并将其写入他创建的新文件中。客户端发送我创建的流的子类:继承自 FileStreamFileStreamEx

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

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) 之后,无论文件大小和输出是什么,“读取”方法都会开始 3 次,而不是转到 UselessMethod1 方法(仅在客户端):

阅读:256

阅读:4352

阅读:69888

并且仅在'Read'方法被调用3次之后,UselessMethod1 才开始。如果您查看下面的代码,您会发现每次读取我的缓冲区 arr 大小仅为 1024!按照逻辑,在 MyStream.Read(buffer, 0, bufferSize)) 之后,我的“Read”方法需要开始,但事实并非如此,“Read”方法随机启动(或者不是,我无法理解)并且当我的“读取”方法开始时,我的“读取”方法所具有的参数“字节[]数组”的 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

...

..

.

但它不是out out!我的错误在哪里?有什么错误吗?

最佳答案

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

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

关于c# - WCF -Stream.Read - 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10586731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com