【问题标题】:Why is WCF Stream response getting corrupted on write to disk?为什么 WCF 流响应在写入磁盘时损坏?
【发布时间】:2011-01-11 00:50:25
【问题描述】:

我想编写一个 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() 子句。

标签: c# .net wcf streaming stream


【解决方案1】:

我认为问题是这样的:

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

然后它应该可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 2016-01-10
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多