我目前正在修复一个基于 WCF 的服务器,该服务器能够为客户端提供大型(数 GB)mpeg 视频文件。
客户端应保存视频并在下载时查看。缓冲服务失败,因为视频已完全加载到内存中。
当我尝试使用 wget.exe 或 Web 浏览器获取它时,它只加载一部分(大约 600 到 800 MB),然后在客户端和服务器端都没有错误地停止。
在 Internet Explorer 中打开视频流时,底部没有出现时间滑块,并且 HTTP 响应的 header 中没有 content-length。
HTTP 响应在标头中不包含 Content-Length,尽管它已在代码中设置(见下文)。
有谁知道如何解决这个问题,或者另一种方法?
服务的合约接口:
[ServiceContract(Namespace = "http://www.blah.com/MyFunnyVideos")]
public interface IMyFunnyVideosService
{
[OperationContract(Name = "GetVideo")]
[WebGet(UriTemplate = "LORESVIDEO/{videoId}", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
Stream GetVideo(string videoId);
}
执行:
[ServiceBehavior(Namespace = "http://www.blah.com/MyFunnyVideos", InstanceContextMode = InstanceContextMode.PerCall)]
public class MyFunnyVideosService : IMyFunnyVideosService
{
// ...
Stream IMyFunnyVideosService.GetVideo(string videoIdString)
{
Logger.LogMethod();
try
{
FileStream fstream = GetVideoFileStream(int.Parse(videoIdString));
fstream.OpenRead();
var response = WebOperationContext.Current.OutgoingResponse;
response.ContentLength = fstream.Length;
return fstream;
// ...
}
Web 服务配置包含:
<webHttpBinding>
<binding name="restBinding" transferMode="StreamedResponse" maxBufferSize="21474836470" maxReceivedMessageSize="21474836470" />
</webHttpBinding>
<behaviors>
<endpointBehaviors>
<behavior name="[omitted]">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
HTTP 响应标头:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: video/mpeg
Server: Microsoft-HTTPAPI/2.0
Date: Thu, 30 Jan 2013 15:52:04 GMT