我可以为上传和下载使用WCF服务吗?

3
我正在为学校开发一个媒体服务器项目,选择了WCF方法。然而,我开始怀疑这是否是一个好主意。
让WCF服务上传和下载文件是否容易?所谓容易,是指不需要大量的黑客技巧或第三方库。该WCF服务还将向其使用者/客户端流传音频和视频。
我还应该提到,所讨论的WCF服务是作为Windows托管服务托管在IIS之外。
这就是我目前设想的大致情况:
    [OperationContract]
    bool AddFile(byte[] filedata);
    [OperationContract]
    bool DeleteFile(int fileid);
    [OperationContract]
    byte[] GetFile(int fileid);

如何启用流式传输:http://msdn.microsoft.com/zh-cn/library/ms789010.aspx - Mitch Wheat
@Mitch:我打算之后处理流媒体。目前,我希望能得到有关上传和下载的任何建议。我找到了一些解决方案的网站,但它们大多数都对其方法有某种限制。例如,其中一种方法只能在WCF服务作为IIS或Windows服务管理外部的控制台应用程序启动时才能工作。 - rafale
1个回答

2
定义使用并返回Stream数据类型的方法,并确保配置绑定使用TransferMode.Streamed。同时,请注意您在绑定中使用的编码方式。如果使用Text,则所有二进制数据都将被base64编码,这将使所有请求/响应的大小膨胀。如果使用MTOM,则大型二进制数据(如流)将作为HTTP正文的单独实体传输到SOAP主体之外,作为纯粹的未编码二进制数据。二进制编码显然提供了最优的传输效果,但它不是标准格式,因此与其他非WCF堆栈的互操作性可能无法实现。如果您只使用WCF,则无法击败二进制消息编码的性能,因此我强烈推荐使用它或者如果需要互操作性则回退到MTOM。
此外,迄今为止我有些假设您正在尝试在SOAP的范围内完成此操作。如果您使用REST,则XML vs. MTOM vs. 二进制编码会得到缓解,因为您可以只发送/接收具有适当内容类型的纯二进制HTTP正文。一切取决于您想要做什么。

目前,我只需要WCF服务能够处理简单的文件传输。此外,我并不是很了解REST。我应该使用它来代替SOAP吗? - rafale
什么被归类为“简单”?你是指文件大小小于1MB吗?使用流和流模式的重点在于,如果不这样做,整个请求/响应必须在从WCF服务分派/返回之前缓冲到内存中。显然,如果您的消息很大,这将无法很好地扩展。至于SOAP与REST,我不会在这里详细讨论,但我强烈建议阅读一些关于REST的文章,以确定它是否适合您正在构建的服务。 - Drew Marsh
谢谢,我会研究一下。现在有关流的那部分也更加清晰明了。所以,Mitch Wheat提供的链接中描述的内容就是我应该为此做的,对吗?http://msdn.microsoft.com/en-us/library/ms789010.aspx - rafale
只是为了记录,WCF在使用完流后会处理它,所以您不必担心流挂起的问题。(您可以通过继承FileStream并覆盖Dispose方法来验证)。 - Dax Fohl

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