是否可以使用WCF通过MessageContract传输文件,而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上带有Streaming声明,该流必须是MessageContract的主体,并且我认为这是当前违反的规则。我希望FileTransferMessage是主体,然后流是主体是可以接受的。

有人对我在这里可以做什么有任何建议?我不想将Stream / FileName / FileLength添加到我的传输对象。

最佳答案

作为设计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

10-06 12:35