C# WCF服务-支持范围为:字节的流文件支持?

C# WCF服务-支持范围为:字节的流文件支持?,c#,.net,wcf,http,C#,.net,Wcf,Http,我有一个WCF服务,可以通过WebGet返回流。到目前为止,这工作还不错。 但是我想实现的是对Range头的支持,这样只返回文件的一部分。 这是我目前的代码: public System.IO.Stream GetStream(string mElementID) { // build the filePath FileInfo file = GetFile(mElementID); try { FileSt

我有一个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);
}
我只是创建一个文件流,然后返回它。现在我想知道什么是最好的方式,以获得一系列的流

我想我可以将videoStream.Position设置为范围的起始值,但是从文件中的somwehere到文件中的某个地方获取零件的最佳方法是什么

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

您可以按照自己的建议执行。使用filestream,将位置设置为范围的开头。创建设置为所需范围长度的字节数组。那就做吧

videoStream.Read(myByteArray, 0, myByteArray.Length)
或者,您可以将该位置设置为文件流的开头,并在调用read时使用第二个参数来将自己从文件流的开头偏移


读入缓冲区(字节数组)后,可以将其放入新的内存流(该内存流具有接受字节数组的重载构造函数)。然后,您可以返回导出的memoryStream。

谢谢您的回答,解释得很好。我担心的是内存消耗,因为视频必须完全读入内存。我正在使用的服务不会有很多用户,所以这可能不是问题,但我想知道是否有更好的方法,从性能角度来看。关于您的性能问题,发布第二个问题可能是值得的。然而,流在性能方面非常好,并且在您的原始帖子中显示了实现,我不相信您正在将整个流加载到内存中。根据我的建议,只有缓冲区。希望有帮助。