为什么WCF Stream响应在写入磁盘时会被破坏?

时间:2010-01-29 21:17:06

标签: c# .net wcf streaming stream

我想编写一个可以通过网络将文件发送到客户端的WCF Web服务。所以我有一个发送Stream响应的设置。这是我在客户端的代码:

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");
}

一切都很好,没有任何错误或例外。问题是,当我打开它时,传输的.jpg文件被报告为“已损坏或太大”。

我做错了什么?

在服务器端,这是发送文件的方法。

public Stream GetData()
{
    string filename = Environment.CurrentDirectory+"\\Chrysanthemum.jpg";
    FileStream myfile = File.OpenRead(filename);
    return myfile;
}

我的服务器配置了使用Transfermode.StreamedResponse的basicHttp绑定。

1 个答案:

答案 0 :(得分:4)

我认为问题是:

while ((bytesRead = source.Read(buffer,0,length))> 0)
{
    sink.Write(buffer,0,length);
}

想象一下,你正在读取文件的最后一位 - 也许它不再是256字节,而只是10字节。

您读取了最后10个字节,bytesRead将为10,但在sink.Write操作中,您仍然使用固定值length(256)。因此,当您读取最后一个数据块时,您正在写出一个可能太大的块。

您需要将sink的行更改为:

   sink.Write(buffer, 0, bytesRead);

然后它应该工作。