【问题标题】:WCF Error on Streaming back to client callback using NetTcpBinding使用 NetTcpBinding 流回客户端回调时出现 WCF 错误
【发布时间】:2012-05-16 20:28:20
【问题描述】:

我有一个 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);
}

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

【问题讨论】:

    标签: c# wcf wcf-streaming


    【解决方案1】:

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

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

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

    【讨论】:

    • 也许我不需要使用“oneway = true”,我成功地从客户端流向服务器,我只想能够流回客户端,我不想使用缓冲数据,因为我正在流式传输图像。
    • 我假设你在添加回调合约之前成功了。回调合约改变了故事。一旦你这样做了,主合约的形状也需要是单向的。有关背景信息,请参阅 msdn.microsoft.com/en-us/library/ms731064.aspxmsdn.microsoft.com/en-us/library/…
    • 有没有办法以流模式将流传递给回调客户端?
    • 我没有看到使用 byte[] 将图像发送回客户端而不是 Streams 的含义?我目前正在使用前者 (byte[]) 作为我在 Silverlight 中进行的视频聊天的一部分(双工,使用 netTcp),它的工作原理就像一个魅力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多