WCF流媒体文件问题

时间:2012-10-09 14:09:55

标签: c# wcf streaming messagecontract

是否可以使用带有MessageContract的WCF流式传输文件,该MessageContract包含另一个在其中包含Stream的MessageContract?我认为答案是肯定的,但我更倾向于将我的文件打包成“Root”消息。

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

[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没有被正确地反序列化并且作为空引用返回。我知道我已经在某个地方读过一条规则,该规则在一个带流的MessageContract上声明Stream必须是MessageContract的主体,我认为这就是现在被侵犯的内容。我希望FileTransferMessage是Body,然后Stream就是Body的身体。

任何人对我能在这做什么都有任何建议吗?我不想将Stream / FileName / FileLength添加到我的Transport对象。

1 个答案:

答案 0 :(得分:3)

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

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

此处的权威文档为http://msdn.microsoft.com/en-us/library/ms730255.aspxhttp://msdn.microsoft.com/en-us/library/ms733742.aspx

相关问题