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

4 回答 4

13

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

于 2008-12-18T20:26:26.107 回答
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

于 2008-11-27T12:48:28.923 回答
1

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

于 2011-03-15T19:27:51.940 回答
0

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

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

于 2010-10-19T13:23:21.080 回答