WCF流文件问题

3
可以使用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;
}

请求已成功发送和接收到服务,但是似乎流没有被正确地反序列化并返回为空引用。我知道在带有流的MessageContract上阅读过一条规则,即流必须是MessageContract的正文,并且我认为这是当前违反的规则。我希望FileTransferMessage作为正文,然后流作为其正文是可以接受的。您有什么建议吗?我希望不要将流/文件名/文件长度添加到我的传输对象中。
1个回答

3
作为MessageContract设计团队的一员,我可以告诉你答案是否定的 :) MessageContract代表一个完整的SOAP消息,您不能将它们嵌套在彼此中(例如您的FileTransferMessage只是交给序列化程序,它不知道[MessageContract]属性,会忽略它,并且也不知道任何特殊的Stream行为)。
除非创建自定义消息子类(甚至自定义Stream子类),否则我想不到好的解决方案。如果每个消息都有fId和fTimestamp,请考虑使用自定义消息检查器来注入这些内容,然后只需在操作中使用FileTransferMessage即可。
权威文档在这里:http://msdn.microsoft.com/en-us/library/ms730255.aspxhttp://msdn.microsoft.com/en-us/library/ms733742.aspx

谢谢Eugene。我决定将Stream放在主MessageContract中,我只需要在应用程序文档中调用它以证明原因。 - Tada

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接