WCF Stream-Service将数据推送到客户端

时间:2014-10-12 20:44:03

标签: c# wcf wcf-binding

我目前正致力于使用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);
    }

因为我在服务器端没有流。我在想另一种方法将数据推送到客户端将是一个很好的方法。 但是,其他的污染概念会很棒。

1 个答案:

答案 0 :(得分:2)

WCF不支持像这样推送流数据。请记住,客户端和服务器位于不同的内存空间中。服务器永远不能访问客户端拥有的对象。当您返回流时,WCF为客户端构造错觉,客户端从中读取的流是服务器返回的内容。 WCF不能以相反的方式做到这一点。

为自己写一个从第三方课程中读取的自定义流。从服务器返回该流。