Response.BinaryWrite创建.partial文件?

时间:2014-03-05 15:20:11

标签: c# asp.net httpresponse

我正在尝试将内存流中的.wav音频文件写入响应,以便客户端可以下载它。在尝试打开文件时,它看起来像在客户端,它具有“.partial”扩展名。这几乎就好像文件没有发布给客户端。

以下是我的代码...尝试将字节直接写入本地机器工作正常(您将看到该代码被注释掉)。

        // Initialize a new instance of the speech synthesizer.
        using (SpeechSynthesizer synth = new SpeechSynthesizer())
        using (MemoryStream stream = new MemoryStream())
        {

            // Create a SoundPlayer instance to play the output audio file.
            MemoryStream streamAudio = new MemoryStream();

            // Configure the synthesizer to output to an audio stream.
            synth.SetOutputToWaveStream(streamAudio);
            synth.Speak("This is sample text-to-speech output. How did I do?");
            streamAudio.Position = 0;

            // Set the synthesizer output to null to release the stream. 
            synth.SetOutputToNull();

            // Insert code to persist or process the stream contents here.
            // THIS IS NOT WORKING WHEN WRITING TO THE RESPONSE, .PARTIAL FILE CREATED
            Response.Clear();
            Response.ContentType = "audio/wav";
            Response.AppendHeader("Content-Disposition", "attachment; filename=mergedoutput.wav");
            Response.BinaryWrite(streamAudio.GetBuffer());
            Response.Flush();

            // THIS WORKS WRITING TO A FILE
            //System.IO.File.WriteAllBytes("c:\\temp\\als1.wav", streamAudio.GetBuffer());

        }

2 个答案:

答案 0 :(得分:1)

MemoryStream.GetBuffer不是正确的调用方法:

  

请注意,缓冲区包含可能未使用的已分配字节。   例如,如果字符串“test”被写入MemoryStream   对象,从GetBuffer返回的缓冲区的长度是256,而不是   4,未使用252字节。要仅获取缓冲区中的数据,请使用   ToArray方法;但是,ToArray会在其中创建数据的副本   存储器中。

所以请改用MemoryStream.ToArray

Response.BinaryWrite(streamAudio.ToArray());

答案 1 :(得分:0)

看起来问题是speak方法需要在自己的线程上运行。以下提供了正确返回字节数组然后能够将其写入响应的解决方案。

C# SpeechSynthesizer makes service unresponsive