Сервис WCF - поддержка потоковых файлов с поддержкой Range: bytes? - PullRequest
5 голосов
/ 06 мая 2011

У меня есть служба 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 и записать в него соответствующие байты? Файлы, которые здесь передаются, являются видеофайлами, поэтому могут быть довольно большими.

1 Ответ

2 голосов
/ 06 мая 2011

Вы можете сделать, как вы предложили. С помощью файлового потока установите позицию в начало диапазона. Создайте байтовый массив с заданной длиной диапазона. Тогда сделай

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

В качестве альтернативы, вы можете установить позицию в начало файлового потока и использовать второй параметр при вызове read, чтобы сместить себя от начала fileStream.

Как только вы прочитали в буфер (байтовый массив), вы можете поместить его в новый поток памяти (который имеет перегруженный конструктор, который принимает байтовый массив). Затем вы можете вернуть производное memoryStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...