在Wcf中如何使用消息类进行流传输?

时间:2014-02-12 12:54:04

标签: c# .net wcf templates filestream

在.NET WCF中我想使用TransferMode.Streamed。因此,我需要一个Message对象来传输多个参数。为了避免传输任何参数组合的很多消息类,我尝试使用模板类。两个参数的示例:

[MessageContract]
public class StreamMessage<TA,TB>
{
    [MessageHeader(MustUnderstand = true)]
    public TA Value1;

    [MessageBodyMember(Order = 1)]
    public TB Value2;
}

如果我使用模板类来传输FileStream对象,则客户端会收到始终关闭的流。 服务器:

public StreamMessage<String,FileStream> DownloadFromServer()
{
    Console.WriteLine("DownloadFromServer()");
    const string filename = @"c:\The\File\Name";
    var result = new StreamMessage<String,FileStream>();
    result.Value1 = filename;
    result.Value2 = File.OpenRead(filename);
    return result;
}

如果不使用消息模板,则不会发生这种情况。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

FileSteam无法序列化。尝试使用Steam类:

public StreamMessage<String, Stream> DownloadFromServer()
{
    Console.WriteLine("DownloadFromServer()");
    const string filename = @"c:\The\File\Name";
    var result = new StreamMessage<String, Stream>();
    result.Value1 = filename;
    result.Value2 = File.OpenRead(filename);
    return result;
}

答案 1 :(得分:0)

根据Florians回答,以下内容是可能的,例如:对于两个值和一个流值:

[MessageContract]
public class StreamMessage<T1,T2>
{
    [MessageHeader(MustUnderstand = true)]
    public T1 Val1;

    [MessageHeader(MustUnderstand = true)]
    public T2 Val2;

    [MessageBodyMember(Order = 1)]
    public Stream Stream;
}

如果是Stream类型,WCF会将此限制为仅限于正文中的一个对象。因此我决定两个模板:Message和StreamMessage。