在.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;
}
如果不使用消息模板,则不会发生这种情况。有什么建议吗?
答案 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。