zoukankan      html  css  js  c++  java
  • 解决WCF双工通讯模式中向ChannelFactory提供的InstanceContext包含未实现CallbackContractType的问题

    最近在苦学WCF,把我遇到的WCF双工通讯模式的一个小问题呈现出来,同时在网上找了一下发现也有很多网友,也有此问题“向ChannelFactory提供的InstanceContext包含未实现CallbackContractType”!

    好了废话不多说,贴出代码解决问题!

    1.项目结构(myWcfService是个wcf服务库项目,wcfClient是个简单的winform项目)

    2.IService1.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;

    namespace myWcfService
    {
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
        [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IServiceDuplexCallback))]
        public interface IService1
        {
            [OperationContract(IsOneWay=true)]
            void AddNumber(int x,int y);
            [OperationContract(IsOneWay=true)]
            void Subtract(int x,int y);
        }
        public interface IServiceDuplexCallback
        {
            [OperationContract(IsOneWay=true)]
            void Calculate(int result);
        }
    }

    3.Service1.cs服务实现

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;

    namespace myWcfService
    {
        // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。
        [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
        public class Service1 : IService1
        {
            IServiceDuplexCallback callback
            {
                get { return OperationContext.Current.GetCallbackChannel<IServiceDuplexCallback>(); }
            }
            public void AddNumber(int x, int y)
            {
                int z = x + y;
                callback.Calculate(z);
            }

            public void Subtract(int x, int y)
            {
                int z = x - y;
                callback.Calculate(z);
            }
        }
    }

    4.callbackhandler.cs服务回调的实现

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;


    namespace wcfClient
    {
        public class CallbackHandler : ServiceReference1.IService1Callback
        {

            public void Calculate(int result)
            {
                System.Windows.Forms.MessageBox.Show("计算结果是:"+result);
            }
        }
    }

    5.

    事件的实现代码

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.ServiceModel;


    namespace wcfClient
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                InstanceContext ic = new InstanceContext(new CallbackHandler());
                ServiceReference1.Service1Client client = new ServiceReference1.Service1Client(ic);
                client.AddNumber(3,4);
            }
        }
    }

    最终的问题就出在第四步:

    这里的实现应该是添加服务引用的时候,应该是自动生成的在客户端的代理类,否则会报如题所示的错误!

  • 相关阅读:
    EasyRTMP内置进入摄像机中实现网络推流直播摄像机的功能
    EasyPlayer安卓Android流媒体播放器实现直播过程中客户端快照功能
    EasyPlayer安卓Android流媒体播放器实现直播过程中客户端快照功能
    如何用传统摄像机实现直接对接平台,类似于海康萤石、大华乐橙的方案
    如何用传统摄像机实现直接对接平台,类似于海康萤石、大华乐橙的方案
    EasyIPCamera实现的桌面采集直播用于课堂、会议、展销同屏等应用
    EasyIPCamera实现的桌面采集直播用于课堂、会议、展销同屏等应用
    EasyPlayer实现视频播放局部缩放、广角平移功能(类似水滴直播,快手视频)
    EasyPlayer实现视频播放局部缩放、广角平移功能(类似水滴直播,快手视频)
    EasyPusher实现将asterisk直播流以RTSP转发实现通话直播与录像
  • 原文地址:https://www.cnblogs.com/zpc870921/p/2658669.html
Copyright © 2011-2022 走看看