我正在尝试使用HttpHandler从一个ASP.NET Web应用程序将QuickTime视频流式传输到iPhone。从IIS 5.1(Windows XP)托管Web应用程序时,视频播放器将打开,然后显示错误“服务器未正确配置”。但是,使用IIS 7.5(Windows 7)时,视频播放正常。

生产环境正在运行IIS 6.0并且存在同样的问题,尝试通过Mobile Safari在iPhone上播放视频会显示上述错误。

我已经检查了Http Headers,它们在两台服务器之间看起来几乎相同(除了一些,例如 Server 标头,显然会有所不同),除了它们以不同的顺序出现,但我怀疑这是否会导致问题。

根据Google上的此主题添加'Accept-Ranges:bytes'标题的组可以提供帮助,尽管这对我们没有任何影响。我还添加了ETag标题,没有任何运气。

实际负责发送文件的代码如下所示:

Context.Response.Buffer = true;
Context.Response.ContentType = "video/x-m4v";

Context.Response.AppendHeader("Content-Disposition", "filename=\"Video.m4v\"");
Context.Response.AppendHeader("Content-Length", "23456789");

Context.Response.AppendHeader("Accept-Ranges", "bytes");
Context.Response.AppendHeader("ETag", GetETag(path));

Context.Response.TransmitFile(path);

上面传输文件的代码似乎运行正常,视频文件在所有桌面浏览器中以及在Windows 7上从IIS 7.5托管时都能正常播放。只有在尝试使用Mobile在iPhone上播放视频文件时才会出现此问题。 Safari使用上面的代码将ASP.NET Web应用程序托管在IIS 5.1或IIS 6.0上。

有没有其他人经历过这样的事情并且对我能做些什么来获得这个有用的想法?

有帮助吗?

解决方案

为什么将Response.Buffer设置为true?

你不能简单地添加“Accept-Ranges”和“Accept-Ranges”。标头,除非您还确保服务器支持HTTP范围请求。如果客户端播放器要求支持Range请求并且服务器拒绝处理它们,那么请求将被拒绝是合乎逻辑的。

您可以尝试将Fiddler用作反向代理,并查看IPhone是否发出Range请求。 http://www.fiddler2.com/Fiddler/Help/ReverseProxy.asp

其他提示

经过一番搜索后,我看到了 ASP.NET中的特定于范围的请求,它描述了我遇到的确切问题。从这个站点实现 RangeRequestHandlerBase 类(通过一些微小的修改以适应我们现有的项目结构)似乎已经解决了问题,现在视频播放可以在IIS5 / 6中正确运行。

@Eric - 我对你的回答进行了评价,因为你的评论是朝着正确的方向推进的。简单地添加'Accept-Ranges'标头是不够的(尽管在IIS7中工作),并且需要修改http处理程序以处理范围请求并确保正在发送正确的数据。

使用像Fiddler这样的东西来公开来自服务器的确切HTTP响应。捏住客户端的用户代理字符串以匹配iPhone浏览器(或仅使用Safari?)并比较IIS 5.1和7.5的输出。显然,响应流不相同,或者两者都有效。

您也可以使用NetMon,这是一个很棒的工具......并允许您使用iPhone本身进行测试。

抱歉,我没有给你一个具体的答案,但我认为你不得不亲自动手。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top