WCF数据块传输/流传输

12

我正在使用 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个回答

13

本文介绍了如何使用MessageHeader属性来强制将某些内容传递到头文件中,而不计入参数。因此,不需要传递流和其他元数据,只需创建一个带有MessageContract属性的类,并将所有元数据标记为MessageHeader。然后,将流标记为MessageBodyMember(文章错误地称之为“MessageBody”)。您的UploadStream方法应该接受一个参数,其类型为刚刚创建的MessageContract类的类型。我已经成功地实现了这一点,但我还没有与分块一起实现过。祝好运。


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

1
我建议看一下 MessageContracts,并将这些值作为消息头添加到您的对象中。这样应该可以将流及其相关的任何值作为消息头传递。

0

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