2010-01-29 87 views
4

我想编写一个WCF Web服务,可以通过电线将文件发送到客户端。所以我有一个发送Stream响应的设置。这是我在客户端上的代码:为什么WCF 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; 
} 

我使用basicHttp与Transfermode.StreamedResponse绑定来配置服务器。

+0

不要忘记在FileStream周围使用using()子句。 – Cheeso 2010-04-28 03:15:20

回答

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

,然后它应该工作。

+0

您先生,是正确的。现在工作正常。我把帽子戴在你身上...... – 2010-01-29 21:48:12

相关问题