1

我目前正在修复一个基于 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
4

1 回答 1

2

必须回答我自己的问题:

这只是一个超时。webHttpBinding 中的默认 sendTimeout 为 1 分钟,然后传输停止而没有任何错误。

所以,我只需要在 webHttpBinding 中设置 sendTimeout="00:10:00" 10 分钟超时。

于 2013-02-13T09:17:23.707 回答