У меня есть служба WCF, которая может возвращать поток через WebGet. Это работает нормально, насколько далеко.
Но я хотел бы реализовать поддержку заголовка 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 и возвращаю его. Теперь мне интересно, как лучше всего получить диапазон этого потока.
Я думаю, что я мог бы установить videoStream.Position в качестве начального значения Range, но каков наилучший способ получить деталь из где-то в файле до где-то в файл
Должен ли я создать MemoryStream и записать в него соответствующие байты?
Файлы, которые здесь передаются, являются видеофайлами, поэтому могут быть довольно большими.