【问题标题】:WCF Streaming File IssueWCF 流文件问题
【发布时间】:2012-09-29 21:34:05
【问题描述】:

是否可以使用带有 MessageContract 的 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;
}

请求可以很好地发送和接收到服务,但是,Stream 似乎没有被正确反序列化并作为空引用返回。我知道我在某处读过一条规则,该规则在带有 Streaming 的 MessageContract 上声明 Stream 必须是 MessageContract 的主体,我认为这就是现在被违反的内容。我希望 FileTransferMessage 作为 Body,然后 Stream 作为 Body 是可以接受的。

有人对我可以在这里做什么有任何建议吗?我不希望将 Stream/FileName/FileLength 添加到我的 Transport 对象中。

【问题讨论】:

    标签: c# wcf streaming messagecontract


    【解决方案1】:

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

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

    这里的权威文档是http://msdn.microsoft.com/en-us/library/ms730255.aspxhttp://msdn.microsoft.com/en-us/library/ms733742.aspx

    【讨论】:

    • 谢谢尤金。我决定允许 Stream 在主 MessageContract 中,我只需要在应用程序文档中调用它来说明原因。
    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 2010-12-18
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多