我有一个可以通过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并将相关的字节写入其中? 这里流式传输的文件是视频文件,因此可能非常大。
答案 0 :(得分:2)
你可以按照自己的建议去做。使用文件流,将位置设置为范围的开头。创建一个设置为所需范围长度的字节数组。然后做
videoStream.Read(myByteArray, 0, myByteArray.Length)
或者,您可以将位置设置为文件流的开头,并在调用read时使用第二个参数从fileStream的开头自己偏移。
一旦读入缓冲区(字节数组),就可以将它放入一个新的内存流(它有一个重载的构造函数,它接受一个字节数组)。然后,您可以返回派生的memoryStream。