是否可以使用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.aspx和http://msdn.microsoft.com/en-us/library/ms733742.aspx