WCF分块/流媒体

时间:2008-11-27 12:13:09

标签: wcf streaming uploading chunking

我正在使用WCF并希望将大文件从客户端上传到服务器。我已经调查并决定遵循http://msdn.microsoft.com/en-us/library/aa717050.aspx

中概述的分块方法

但是,这种方法(就像流式传输一样)将合同限制为有限的方法签名:

[OperationContract(IsOneWay=true)]
[ChunkingBehavior(ChunkingAppliesTo.InMessage)]
void UploadStream(Stream stream);

该示例使用了相当方便的示例,即从固定路径上载文件并将其保存到服务器上的固定路径。因此,我的问题是如何传递其他参数来指定文件名,文件路径等。

例如。我想要像:

[OperationContract(IsOneWay=true)]
[ChunkingBehavior(ChunkingAppliesTo.InMessage)]
void UploadStream(Stream stream, String filePath);

提前致谢, 标记

4 个答案:

答案 0 :(得分:13)

This article解释了如何使用MessageHeader属性强制在标题中传递内容,因此不算作参数。因此,不是传递流和其他元数据,而是创建一个具有MessageContract属性的类,并将所有元数据标记为MessageHeader。然后,将流标记为MessageBodyMember(文章不正确地称为“MessageBody”)。让您的UploadStream方法采用一个参数,其类型是您刚刚创建的MessageContract类的参数。我已经成功完成了这项工作,但我还没有与分块一起完成。祝你好运。

答案 1 :(得分:3)

您可以在服务会话中使用并在IsInitiating属性设置为true的合同中使用初始化方法。类似的东西:

[OperationContract(IsInitiating = true)]
void InitializeUploadService(string filename);

[OperationContract(IsOneWay = true, IsInitiating = false)]
[ChunkingBehavior(ChunkingAppliesTo.InMessage)]
void UploadStream(Stream stream);

我从未尝试过使用流媒体服务,但基本上应该让WCF强制执行在UploadStream之前始终调用InitializeUploadService。

可在此处找到更多文档: http://msdn.microsoft.com/en-us/library/system.servicemodel.description.operationdescription.isinitiating.aspx

答案 2 :(得分:1)

我会查看MessageContracts并将这些值作为邮件标题添加到您的对象中。这应该允许您将流和与流相关的任何值作为消息头传递。

答案 3 :(得分:0)

在客户端和服务器端设置maxItemsInObjectGraph对我有用。

(不要忘记客户端。)http://social.msdn.microsoft.com/Forums/en/wcf/thread/0af69654-2d89-44f3-857a-583b57844ca5