0

我有一个 WCF 服务,使用NetTcpBinding TransferMode.Streamed,我正在寻找使用它的回调流回客户端,但我得到了这个异常host.Open

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);
}

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

4

1 回答 1

1

您的 IScreenShot 合同并不完全是单向的。它需要用于双工合同,在一个方向上是单向的,在另一个方向上也是单向的。

也就是说,由于需要缓冲消息的内部机制,流式传输和双工根本不会混合。所以这无论如何都行不通。

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

于 2012-05-16T20:38:04.503 回答