3

是否可以使用带有 MessageContract 的 WCF 流式传输文件,该 MessageContract 包含另一个 MessageContract,其中包含 Stream?我认为答案是否定的,但可以这么说,我更愿意将我的文件打包在“根”消息中。

换句话说,我的设置是这样的:

[MessageContract]
public class Transport
{
    [MessageHeader]
    private readonly Guid fId;

    [MessageHeader]
    private readonly DateTime fTimestamp;

    [MessageBodyMember(Order = 1)]
    public FileTransferMessage FileTransferMessage { get; set; }
}

[MessageContract]
public class FileTransferMessage : IDisposable
{
    [MessageBodyMember(Order = 1)]
    public Stream FileByteStream;

    [MessageHeader(MustUnderstand = true)]
    public long FileLength;

    [MessageHeader(MustUnderstand = true)]
    public string FileName;
}

请求可以很好地发送和接收到服务,但是,Stream 似乎没有被正确反序列化并作为空引用返回。我知道我在某处阅读了一条规则,该规则在带有 Streaming 的 MessageContract 上声明 Stream 必须是 MessageContract 的主体,我认为这就是现在被违反的内容。我希望 FileTransferMessage 作为 Body,然后 Stream 作为 Body 是可以接受的。

有人对我可以在这里做什么有任何建议吗?我不希望将 Stream/FileName/FileLength 添加到我的 Transport 对象中。

4

1 回答 1

3

作为设计 MessageContract 团队的一员,我可以告诉你答案是否定的 :) MessageContract 正好代表一个完整的 SOAP 消息,你不能将它们相互嵌套(你的示例中的 FileTransferMessage 只是交给序列化程序,它对 [MessageContract] 属性一无所知并忽略它,并且对任何特殊的 Stream 行为一无所知)。

由于没有创建自定义 Message 子类(甚至是自定义 Stream 子类),我想不出一个好的解决方案。如果每条消息上都有 fId 和 fTimestamp,请考虑使用自定义消息检查器来注入它们,然后在您的操作中使用 FileTransferMessage。

这里的权威文档是http://msdn.microsoft.com/en-us/library/ms730255.aspxhttp://msdn.microsoft.com/en-us/library/ms733742.aspx

于 2012-10-09T22:43:39.977 回答