Почему отклик WCF Stream поврежден при записи на диск? - PullRequest
4 голосов
/ 30 января 2010

Я хочу написать веб-сервис 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.

1 Ответ

4 голосов
/ 30 января 2010

Я думаю, что проблема заключается в следующем:

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

и тогда оно должно работать.

...