WCF双工实现

  1. Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口
  2. WCF双工:客户端请求服务端,服务端处理完后再主动调用客户端;

服务端步骤

  1. 服务端:新增2个接口(1个服务契约接口、1个回调接口),1个服务契约接口派生实现类、配置文件新增配置、启动服务监听端口,
    //1 服务契约接口, (CallbackContract = typeof(ICallback)) 要实现双工这个一定要加上,指定服务锲约为 ICallback
    [ServiceContract(CallbackContract = typeof(ICallback))]
    public interface ICalculateService
    {
        //操作契约, IsOneWay = true 要实现双工这个一定要加上
        [OperationContract(IsOneWay = true)]
        void Add(int x, int y);
    }

	//2 回调接口,接口名称自定义
    public interface ICallback
    {
        //回调契约
        [OperationContract(IsOneWay =true)]
        void Show(int n);
    }
    
    //3 服务契约的实现类
    public class CalculateService : ICalculateService
    {
        public void Add(int x, int y)
        {
            int result = x + y;
            Thread.Sleep(2000);
            //通过客户端实例通道
            ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
            //对客户端调用
            callback.Show(result);
        }
    }
  1. 服务端:WCF配置文件,在web.config/app.config里
<system.serviceModel>
		<behaviors>
			<serviceBehaviors>
				<!--WCF-->
				<behavior name="CalculateServicebehavior">
					<serviceDebug httpHelpPageEnabled="false"/>
					<serviceMetadata httpGetEnabled="false"/>
					<serviceTimeouts transactionTimeout="00:10:00"/>
					<serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000"/>
				</behavior>
			</serviceBehaviors>
		</behaviors>

		<!--WCF-->
		<bindings>
			<netTcpBinding>
				<binding name="tcpbinding">
					<security mode="None">
						<transport clientCredentialType="None" protectionLevel="None"/>
					</security>
				</binding>
			</netTcpBinding>
		</bindings>

		<!--WCF-->
		<services>
			<service name="MySOA.Service.CalculateService" behaviorConfiguration="CalculateServicebehavior">
				<host>
					<baseAddresses>
						<add baseAddress="net.tcp://localhost:11111/CalculatorService"/>
					</baseAddresses>
				</host>
				<endpoint address="" binding="netTcpBinding" bindingConfiguration="tcpbinding" contract="MySOA.Interface.ICalculateService"/>
				<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
			</service>
		</services>
		
	</system.serviceModel>
  1. 启动WCF服务,比如用控制台程序
        static void InitService()
        {
            List<ServiceHost> serviceHosts = new List<ServiceHost>()
            {
                new ServiceHost(typeof(CalculateService))
            };

            foreach (var serviceHost in serviceHosts)
            {
                serviceHost.Opened += (s, e) => { Console.WriteLine(serviceHost.GetType().Name + "启动了..."); };
                serviceHost.Open();

            }
            Console.WriteLine("输入任何字符,中止服务");
            Console.ReadKey();
            foreach (var serviceHost in serviceHosts)
            {
                serviceHost.Close();
            }
        }

客户端步骤

  1. 引用——添加服务引用,输入服务端配置文件里的地址;
    添加服务引用
  2. 创建一个类,继承服务引用里的Callback接口(MySOAClient.ICalculateServiceCallback),并实现方法,此方法届时为服务端主动调用的;
    public class MyCallback : MySOAClient.ICalculateServiceCallback
    {
        public void Show(int n)
        {
            Console.WriteLine($"n:{n}");
        }
    }
  1. 在主函数里创建MyCallback实例并作为参数传入CalculateServiceClient对象,最后调用服务端的方法Add
        static void Main(string[] args)
        {
            MySOAClient.CalculateServiceClient client = null;
            try
            {
                InstanceContext context = new InstanceContext(new MyCallback());
                client = new MySOAClient.CalculateServiceClient(context);
                client.Add(3, 9);
                client.Close();
            }
            catch (Exception ex)
            {
                if (client != null)
                    client.Abort();
                Console.WriteLine(ex.Message);
            }
            Console.Read();
        }
  1. 客户端启动后,调用Add方法,服务端收到并执行Add方法,再执行Callback,再实现对对客户端的回调;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WCF双工通信(Duplex communication)是一种通信方式,它允许客户端和服务器之间进行双向通信。在传统的客户端/服务器模型中,客户端通过发送请求来获取服务器的响应,而服务器没有办法主动向客户端发送信息。但在某些情况下,需要服务器能够主动向客户端发送信息,这时就可以使用WCF双工通信。 实现WCF双工通信需要以下步骤: 1. 定义服务契约:在服务契约中,需要定义一个双工操作,该操作将用于客户端和服务器之间的双向通信。例如: ``` [ServiceContract(CallbackContract = typeof(IMyServiceCallback))] public interface IMyService { [OperationContract(IsOneWay = true)] void MyOperation(); } public interface IMyServiceCallback { [OperationContract(IsOneWay = true)] void MyCallback(); } ``` 上面代码中,`IMyService`是服务契约,它包含一个双工操作`MyOperation`。`IMyServiceCallback`是回调契约,它包含一个回调操作`MyCallback`,用于服务器向客户端发送信息。 2. 实现服务:实现服务契约中的操作,包括双工操作和回调操作。例如: ``` [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] public class MyService : IMyService { public void MyOperation() { // 客户端调用了MyOperation操作 // 这里可以向客户端发送信息 OperationContext.Current.GetCallbackChannel<IMyServiceCallback>().MyCallback(); } } public class MyServiceCallback : IMyServiceCallback { public void MyCallback() { // 服务器调用了MyCallback操作 // 这里可以接收客户端发送的信息 } } ``` 上面代码中,`MyService`类实现了`IMyService`接口,包含一个双工操作`MyOperation`,它可以调用回调操作`MyCallback`,向客户端发送信息。`MyServiceCallback`类实现了`IMyServiceCallback`接口,包含一个回调操作`MyCallback`,用于接收客户端发送的信息。 3. 配置服务:在配置文件中配置服务绑定和终结点,以启用双工通信。例如: ``` <bindings> <netTcpBinding> <binding name="MyBinding" sendTimeout="00:01:00"> <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="true" /> <security mode="None" /> </binding> </netTcpBinding> </bindings> <services> <service name="MyNamespace.MyService"> <endpoint address="" binding="netTcpBinding" bindingConfiguration="MyBinding" contract="MyNamespace.IMyService" /> </service> </services> ``` 上面代码中,使用`netTcpBinding`绑定配置了一个名为`MyBinding`的绑定,用于双工通信。在服务配置中,使用该绑定配置了一个终结点,用于绑定服务契约和实现类。 完成上述步骤后,就可以通过WCF双工通信实现客户端和服务器之间的双向通信了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值