WCF 渐进式下载

4
我将尝试编写一个WCF服务,用于向客户端发送mp3文件。我需要使用渐进式下载来传输mp3文件,因为客户端是Android应用程序,我希望它能尽快开始播放。如何使用WCF进行渐进式下载?这可能吗?
以下是我目前的代码。这似乎可以工作,但它不是渐进式下载。在Android应用程序中播放时,需要等待整个文件下载完毕。
服务合同:
[OperationContract, WebGet(UriTemplate = "/GetFileStream/?filepath={virtualPath}")]
    Stream GetFileStream(string virtualPath);

服务配置:

    <bindings>
        <webHttpBinding>
            <binding name="streamedHttpBinding" transferMode="StreamedResponse"
                     maxReceivedMessageSize="1000000000">
            </binding>
        </webHttpBinding>
    </bindings>
    <service name="...">
            <endpoint address="" behaviorConfiguration="restful" binding="webHttpBinding"
                bindingConfiguration="streamedHttpBinding"
                contract="..." />

     </service>
     <behaviors>
        <endpointBehaviors>
            <behavior name="restful">
                <webHttp />
            </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>

如果您可以提供有关渐进式下载的来源链接,那将非常有帮助。我的谷歌搜索并没有找到太多关于渐进式下载+WCF的内容。感谢您的帮助。
Android代码:
player.reset();
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setDataSource(path);
player.prepare();
player.start();

player是一个MediaPlayer对象。我将数据源设置为路径中的url。


@nithin:你的Android应用程序如何尝试访问mp3文件?你使用了什么代码? - Squonk
@MisterSquonk,我认为Android客户端的行为是正确的。请查看更新问题中的代码。 - Nithin
2
@nithin:好的,你使用WCF编写“服务”端有特别的原因吗?你想要的效果可以通过简单的HTTP服务实现。 - Squonk
@MisterSquonk 是正确的。我假设像 MonoAndroid 这样的东西是手机端客户端,所以我删除了我的答案。它不适用。 - Sixto Saez
@MisterSquonk 服务器端包含其他C#代码,我所知道的只有WCF和ASP.NET Web服务这两个选项。我不知道如何在其中任何一个中进行渐进式下载。使用asp.net服务是否可能?我还没有研究过。 - Nithin
@nithin:查看我的答案,了解如何使用HTTP简单地完成此操作的背景。第二个链接中的HTTPListener可以很容易地编写成Windows控制台应用程序、WinForm应用程序或Windows服务,并且只使用C#而不是ASP.NET。 - Squonk
2个回答

2
所以我找出了问题所在。WCF确实可以进行渐进式下载。我原本认为,当你从服务返回流时,行为配置部分是必需的。但对于webhttpbinding,为了进行渐进式下载,它不应该被设置。将绑定配置设置为streamedResponse将启用分块(chunking),这不是渐进式下载。正确的配置如下。
<bindings>
</bindings>
<service name="...">
        <endpoint address="" behaviorConfiguration="restful" binding="webHttpBinding"
            contract="..." />

 </service>
 <behaviors>
    <endpointBehaviors>
        <behavior name="restful">
            <webHttp />
        </behavior>
    </endpointBehaviors>
</behaviors>

请注意,该端点上没有bindingConfiguration。

感谢 @MisterSquonk 的评论。他们帮助我找到了正确的地方。


0

请看我在这里对这个问题的回答为Android开发流媒体服务器,基本上描述了如何使用IIS作为服务器,在Android上使用AsyncPlayer(MediaPlayer也适用)来“打开”(并逐步流式传输)mp3文件。

还可以看看我在这里对问题的回答如何在C#桌面应用程序和移动设备(Android)之间通过本地网络通信?,其中描述了一个简单的HTTPListener“服务”,用C#编写。它可以用于各种事情,并且可以适应打开一个mp3文件,MediaPlayer可以逐步流式传输。

这只是一些替代WCF的想法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接