【发布时间】:2014-10-13 04:50:56
【问题描述】:
我目前正在处理使用 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。
想知道为什么?
我想以其他方式进行下载,因为在服务器端我没有流。我将从第三方库接收字节。所以我想这样做:
在服务器端:
[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);
}
因为我在服务器端没有流。我在想反过来将数据推送到客户端将是一个不错的方法。 但是,其他解决方案概念会很棒。
【问题讨论】:
-
你最好使用base64传输流,如果传输大文件,必须在web配置中定义。
标签: c# wcf wcf-binding