使用NetTcpBinding回流到客户端回调时出现WCF错误

时间:2012-05-16 20:28:20

标签: c# wcf wcf-streaming

我有一个WCF服务,使用 NetTcpBinding TransferMode.Streamed,我希望使用它的回调流回客户端,但是我在行host.Open上得到了这个例外:< / p>

Contract requires Duplex, but Binding 'NetTcpBinding' doesn't support it or isn't configured properly to support it.

 ServiceHost host;
    public Form1()
    {
        InitializeComponent();
    }   
    private void button1_Click(object sender, EventArgs e)
    {
        Uri baseAddress = new Uri(string.Format("net.tcp://{0}:1991/service", Dns.GetHostName()));
        host = new ServiceHost(typeof(WCF_Server.MainService), baseAddress);
        host.Open();
    }

服务接口:

[ServiceContract(CallbackContract = typeof(IScreenCallback))]
public interface IScreenShot
{
    [OperationContract]
    Stream GetStream(int formatIndex);

    [OperationContract]
    void ShowGallery();
    [OperationContract]
    void CloseGallery();

    [OperationContract]
    void AddImage(Stream stream);
}

public interface IScreenCallback
{
    [OperationContract]
    void NextImage();

    [OperationContract]
    void PrevImage();

    [OperationContract]
    void AddImageClient(Stream stream);
}

我如何将流传递给客户端回调?

1 个答案:

答案 0 :(得分:1)

您的IScreenShot合同并非完全单向。它需要是一个双向合同,单向一个方向,单向一个方向。

也就是说,流媒体和双工完全没有混合,因为需要缓冲消息的内部机制。所以这无论如何都不会工作。

要使此方案在双工模式下工作,您应该将数据切割成合理大小的byte []块,并将它们以块的形式而不是流式传输。您可以使该合约看起来非常像Stream的Write,甚至可以在发送端的Stream派生代理包装器中包装合同实例,这样对于填充流的人来说它看起来几乎相同。