Alv*_*n S 4 .net c# streaming wcf stream
我想编写一个 WCF Web 服务,可以通过线路将文件发送到客户端。所以我有一个发送流响应的设置。这是我在客户端的代码:
private void button1_Click(object sender, EventArgs e)
{
string filename = System.Environment.CurrentDirectory + "\\Picture.jpg";
if (File.Exists(filename))
File.Delete(filename);
StreamServiceClient client = new StreamServiceClient();
int length = 256;
byte[] buffer = new byte[length];
FileStream sink = new FileStream(filename, FileMode.CreateNew, FileAccess.Write);
Stream source = client.GetData();
int bytesRead;
while ((bytesRead = source.Read(buffer,0,length))> 0)
{
sink.Write(buffer,0,length);
}
source.Close();
sink.Close();
MessageBox.Show("All done");
}
Run Code Online (Sandbox Code Playgroud)
一切都进展顺利,没有错误或异常。问题是,当我打开正在传输的 .jpg 文件时,该文件被报告为“已损坏或太大”。
我究竟做错了什么?
在服务器端,这是发送文件的方法。
public Stream GetData()
{
string filename = Environment.CurrentDirectory+"\\Chrysanthemum.jpg";
FileStream myfile = File.OpenRead(filename);
return myfile;
}
Run Code Online (Sandbox Code Playgroud)
我的服务器配置了 basicHttp 与 Transfermode.StreamedResponse 的绑定。
我认为问题是这样的:
while ((bytesRead = source.Read(buffer,0,length))> 0)
{
sink.Write(buffer,0,length);
}
Run Code Online (Sandbox Code Playgroud)
想象一下您正在读取文件的最后一位 - 也许它不再是 256 个字节,而是只有 10 个字节。
您读取最后 10 个字节,bytesRead将是 10,但在sink.Write操作中,您仍然使用固定值length(256)。因此,当您读取最后一个数据块时,您正在写出一个可能太大的块。
您需要将行更改为sink:
sink.Write(buffer, 0, bytesRead);
Run Code Online (Sandbox Code Playgroud)
然后它应该可以工作。