我目前正致力于使用wcf传输大字节数组。
我尝试了以下代码并且可行:
在服务器端:
[OperationContract]
public System.IO.Stream GetData()
{
FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate);
return fs;
}
在客户端:
public void GetFile()
{
IByteService byteService = channelFactory.CreateChannel();
Stream serverStream = byteService.GetData();
byte[] buffer = new byte[2048];
int bytesRead;
FileStream fs = new FileStream(filePath, FileMode.CreateNew);
while ((bytesRead = serverStream.Read(buffer, 0, buffer.Length)) > 0)
{
fs.Write(buffer, 0, bytesRead);
}
}
但反过来却不起作用:
在服务器端:
[OperationContract]
public void WriteToStream(Stream clientStream)
{
FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate);
fs.CopyTo(clientStream);
}
在客户端:
public void SendStream()
{
FileStream bytesReceivedFromTheServerAsFile = new FileStream(filePath,FileMode.OpenOrCreate);
IByteService byteService = channelFactory.CreateChannel();
byteService.WriteToStream(bytesReceivedFromTheServerAsFile);
}
fs.CopyTo(stream)在服务器端抛出NotSupportedException。
想知道为什么?
我想以其他方式进行下载,因为在服务器端我没有流。我将从第三方lib接收字节。所以我想这样做:
在服务器端:
[OperationContract]
public void WriteToStream(Stream clientStream)
{
byte[] buffer = new byte[2048]; // read in chunks of 2KB
int bytesRead = 100;
while ((ThirdPartyClass.GetNextBytes(buffer))
{
clientStream.Write(buffer, 0, bytesRead);
}
}
在客户端:
public void SendStream()
{
FileStream bytesReceivedFromTheServerAsFile = new FileStream(filePath, FileMode.OpenOrCreate);
IByteService byteService = channelFactory.CreateChannel();
byteService.WriteToStream(bytesReceivedFromTheServerAsFile);
}
因为我在服务器端没有流。我在想另一种方法将数据推送到客户端将是一个很好的方法。 但是,其他的污染概念会很棒。
答案 0 :(得分:2)
WCF不支持像这样推送流数据。请记住,客户端和服务器位于不同的内存空间中。服务器永远不能访问客户端拥有的对象。当您返回流时,WCF为客户端构造错觉,客户端从中读取的流是服务器返回的内容。 WCF不能以相反的方式做到这一点。
为自己写一个从第三方课程中读取的自定义流。从服务器返回该流。