В моей системе мне нужно отправить FileStream и общий список пользовательских данных в службу WCF. Вот как я делаю это, чтобы объединить оба в один поток и отправить его службе, которая возвращает поток результатов клиенту:
Договор на обслуживание:
[ServiceContract]
[XmlSerializerFormat]
public interface IMyService
{
[OperationContract]
ResultClass MyOperation(Parameters param);
}
Обратный поток:
[MessageContract]
public class ResultClass
{
[MessageBodyMember]
public System.IO.Stream Stream { get; set; }
}
Входной поток:
[MessageContract]
public class Parameters
{
[MessageHeader]
public long Length1 { get; set;}
[MessageHeader]
public long Length12 { get; set;}
[MessageBodyMember]
public Stream Stream { get; set;}
}
У клиента WCF:
public static void BuildStream(string filePath, List<CustomData> otherParams, ref Parameters param)
{
BinaryFormatter formatter = new BinaryFormatter();
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
MemoryStream allStreams = new MemoryStream();
MemoryStream dataStream = new MemoryStream();
formatter.Serialize(dataStream, otherParams);
dataStream.Seek(0, SeekOrigin.Begin);
fs.Seek(0, SeekOrigin.Begin);
fs.CopyTo(allStreams);
dataStream.CopyTo(allStreams);
param.TemplateLength = fs.Length;
param.DataLength = dataStream.Length;
param.Stream = allStreams;
param.Stream.Seek(0, SeekOrigin.Begin);
}
В реализации сервиса вытащите первый и второй потоки из объединенного потока:
List<CustomData> dataSheets;
using (MemoryStream ms = new MemoryStream())
{
MemoryStream dataStream;
BinaryFormatter formatter = new BinaryFormatter();
byte[] templatebuffer, databuffer;
filebuffer = new byte[m_param.Length1];
databuffer = new byte[m_param.Length2];
// Get the whole stream
m_param.Stream.CopyTo(ms);
ms.Seek(0, SeekOrigin.Begin);
// Get the first stream
ms.Read(templatebuffer, 0, (int)m_param.TemplateLength);
// Get the custom data
ms.Read(databuffer, 0, (int)m_param.DataLength);
using (dataStream = new MemoryStream(databuffer))
{
dataStream.Seek(0, SeekOrigin.Begin);
dataSheets = (List<DataSheet>) formatter.Deserialize(dataStream);
m_param.Stream.Close();
...