为什么将WCF流响应写入磁盘时会损坏?

4

我想编写一个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");
}

一切都没有出现错误或异常。问题在于,当我打开传输的.jpg文件时,它被报告为“损坏或太大”。

我做错了什么?

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

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

我已经配置了具有Transfermode.StreamedResponse的basicHttp绑定的服务器。


不要忘记在 FileStream 周围使用 using() 语句。 - Cheeso
1个回答

5
我认为问题在于这个方面:
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);

然后它应该可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接