WCF服务 - 支持Range:bytes支持的流文件?

时间:2011-05-06 12:08:57

标签: c# .net wcf http

我有一个可以通过WebGet返回流的WCF服务。到目前为止工作正常。 但是我想要实现的是对Range标头的支持,以便只返回部分文件。 这是我的代码:

public System.IO.Stream GetStream(string mElementID)
{
        // build the filePath
        FileInfo file = GetFile(mElementID);
        try
        {
            FileStream videoStream = File.OpenRead(file.FullName);

            if (request.Headers.AllKeys.Contains("Range"))
            {
                long startRange = ...; // get the start range from the header
                long endRange = ...; // get the end range from the header
                videoStream.Position = startRange;
                // how can I set the end of the range?
                //TODO: Don't forget to add the Content-Range header to the response!
            }

            WebOperationContext.Current.OutgoingResponse.ContentType = GetMimeType(file);
            WebOperationContext.Current.OutgoingResponse.Headers.Add("Accept-Ranges", "bytes");
            return videoStream;
        }
        catch (FileNotFoundException){}
        catch (IOException ex)
        {
            throw ex;
        }
        // throw a 404
        throw new WebFaultException(System.Net.HttpStatusCode.NotFound);
}

我只是创建一个FileStream,并返回它。现在我想知道获得一系列Stream的最佳方法是什么。

我想我可以将videoStream.Position设置为Range的起始值,但是从的某个地方从 somwehere获取部分的最佳方法是什么?在文件?

我是否必须创建一个MemoryStream并将相关的字节写入其中? 这里流式传输的文件是视频文件,因此可能非常大。

1 个答案:

答案 0 :(得分:2)

你可以按照自己的建议去做。使用文件流,将位置设置为范围的开头。创建一个设置为所需范围长度的字节数组。然后做

videoStream.Read(myByteArray, 0, myByteArray.Length)

或者,您可以将位置设置为文件流的开头,并在调用read时使用第二个参数从fileStream的开头自己偏移。

一旦读入缓冲区(字节数组),就可以将它放入一个新的内存流(它有一个重载的构造函数,它接受一个字节数组)。然后,您可以返回派生的memoryStream。