是否可以使用带有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对象。
答案 0 :(得分:3)
作为设计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