我有一个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);
}
我如何将流传递给客户端回调?
答案 0 :(得分:1)
您的IScreenShot合同并非完全单向。它需要是一个双向合同,单向一个方向,单向一个方向。
也就是说,流媒体和双工完全没有混合,因为需要缓冲消息的内部机制。所以这无论如何都不会工作。
要使此方案在双工模式下工作,您应该将数据切割成合理大小的byte []块,并将它们以块的形式而不是流式传输。您可以使该合约看起来非常像Stream的Write,甚至可以在发送端的Stream派生代理包装器中包装合同实例,这样对于填充流的人来说它看起来几乎相同。