WCF 双工 回调模式

news2024/11/27 10:16:04

在这里插入图片描述

wcfInterface 项目

》》》wcf服务端提供的服务协议

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
namespace wcfInterface
{
   [ServiceContract(CallbackContract= typeof(ICallBack))]
    public interface ICalculatorService
    {
        [OperationContract(IsOneWay =true)]
        void Minus(int x, int y);
    }
}

》》》 回调接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
namespace wcfInterface
{
    /// <summary>
    /// 这个是约束,不需要协议,有客户端实现
    /// </summary>
    public interface ICallBack
    {
        [OperationContract(IsOneWay = true)]
        void Result(int x, int y, int result);
    }
}

wcfService 实现wcfInterface
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using wcfInterface;

namespace wcfService
{
    public class CalculatorService : ICalculatorService
    {
        /// <summary>
        /// 完成计算,然后返回值
        /// 客户端请问服务器,服务端处理完成之后,触发客户端方法
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        public void Minus(int x, int y)
        {
            int result = x - y;
            // 模拟服务端费时操作
            Thread.Sleep(3000);
            //OperationContext  操作上下文  ,客户端请求 服务端,会携带回调信息的
            ICallBack callback = OperationContext.Current.GetCallbackChannel<ICallBack>();
            callback.Result(x, y, result);
        }
    }
}

宿主到控制台

支持双工的 协议 tcp、Duplehttp
》》》 config配置文件

 <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="tcpbinding" >
          <security mode="None">
            <transport clientCredentialType="None" protectionLevel="None"></transport>
          </security>
        </binding>
      </netTcpBinding>
    </bindings>
    <services>
      <service name="wcfService.CalculatorService" behaviorConfiguration="behaviorConfiguration">
        <!--服务的对象-->
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8000/CalculatorService"/>
            <!--服务的IP和端口号-->
          </baseAddresses>
        </host>
        <endpoint address="" binding="netTcpBinding" bindingConfiguration="tcpbinding" contract="wcfInterface.ICalculatorService"></endpoint>
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" ></endpoint>
        <!--contract:服务契约-->
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="behaviorConfiguration">
          <serviceDebug httpHelpPageEnabled="false"/>
          <serviceMetadata httpGetEnabled="false"/>
          <serviceTimeouts transactionTimeout="00:10:00"/>
          <serviceThrottling maxConcurrentCalls="1000"  maxConcurrentInstances="1000" maxConcurrentSessions="1000"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

》》》 启动服务

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using wcfInterface;
using wcfService;
namespace wcfConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            //用列表 可以方便添加多个服务挂载
            List<ServiceHost> hosts = new List<ServiceHost>() {
                 new ServiceHost(typeof(CalculatorService))
            };
            foreach (var host in hosts)
            {
                host.Opening += delegate 
                {
                    Console.WriteLine($"{host.GetType()}服务正在启动中。。。。");
                };
                host.Opened += (o, e) =>
                {
                    Console.WriteLine($"{host.GetType()}服务 启动成功啦!");
                };
                host.Open();
            }
            Console.WriteLine("按任意键,终止服务");
            Console.Read();
            foreach (var host in hosts)
            {
                host.Close();
            }
            Console.Read();
        }
    }
}

》》》》 以上 是服务端的代码

》》》》以下是客户端代码

客户端代码

》》》引用服务
在这里插入图片描述

》》》 新建一个类 CallBackService 继承 上面的服务中的 回调接口 zenCalculator.ICalculatorServiceCallback

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    public class CallBackService : zenCalculator.ICalculatorServiceCallback
    {
        public void Result(int x, int y,  int result)
        {
            Console.WriteLine($"回调操作结果:{x}-{y}{result}");
        }
    }
}

在这里插入图片描述

》》》 以控制台 为了 请问wcf服务

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.SelfHost;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            zenCalculator.CalculatorServiceClient client = null;
            try
            {
                Console.WriteLine("===============================");
                //双工要借助 InstanceContext   new InstanceContext(  上面新建类对象 )
                InstanceContext context = new InstanceContext(new CallBackService() );
                client = new zenCalculator.CalculatorServiceClient(context);
                client.Minus(55, 3);
                client.Close();
            }
            catch (Exception ex)
            {
                if (client!=null)
                {
                    client.Abort();

                }
                throw;
            }

            Console.Read();
        }

     
    }
}

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1672429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【pouchdb-可视化工具 】

最近使用pouchdb&#xff0c;想找个其对应的可视化工具&#xff0c;可以对数据库进行操作。 找了好久才找到&#xff0c;网上有说先同步到couchdb&#xff0c;再用couchdb的可视化工具查看&#xff0c;其实没有那么麻烦&#xff0c;pouchdb的可视化工具其实藏在另外的pouchdb-…

自然语言转SQL(NL2SQL、Text2SQL)

使用 FastAPI 框架和 LangChain 库构建的简单 Web 服务&#xff0c;其目的是将自然语言处理&#xff08;NLP&#xff09;应用于 SQL 查询生成。以下是代码中使用的技术架构和业务流程的详细说明&#xff1a; 技术架构 FastAPI&#xff1a;一个现代、快速&#xff08;高性能&am…

Django开发实战之定制管理后台界面及知识梳理(下)

接上一篇&#xff1a;Django开发实战之定制管理后台界面及知识梳理&#xff08;中&#xff09; 1、前台设置 1、隐藏路由 当你输入一个错误地址时&#xff0c;可以看到这样的报错&#xff1a; 从这样的报错中&#xff0c;我们可以看到&#xff0c;这个报错页面暴漏了路由&a…

Linux学习之禁用防火墙

查看防火墙状态 systemctl status firewalld.service 第一行前面的圆圈是有颜色的就是开启状态 黑色的就是关闭状态 关闭防火墙 systemctl stop firewalld.service 输入密码认证 再次查看防火墙状态 systemctl status firewalld.service 第一行前面的圆圈变成黑色说明关闭…

【基础技能】Windows常用快捷键

最近做知识管理&#xff0c;梳理了下个人技能&#xff0c;存在好多基础技能都是一知半解&#xff0c;用的时候都是现搜现查&#xff0c;没有形成一个完整的知识体系&#xff0c;导致一些基础不牢靠&#xff0c;需要再次筑基&#xff01; 于是就翻阅了微软的官网&#xff0c;撸…

1Panel应用推荐:Uptime Kuma

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

01 | 为什么需要消息队列?

哪些问题适合使用消息队列来解决&#xff1f; 1. 异步处理 2. 流量控制 使用消息队列隔离网关和后端服务&#xff0c;以达到流量控制和保护后端服务的目的。 3. 服务解耦 无论增加、减少下游系统或是下游系统需求如何变化&#xff0c;订单服务都无需做任何更改&#xff0c…

git版本控制器详解(3)本地和远端同步

为什么要使用gitee&#xff1f; gitee是基于git所搭建的网站&#xff0c;会给我们提供一个稳定的服务器保存我们的版本信息。因为github是国外网站&#xff0c;国内访问速度不够稳定&#xff0c;所以我们选择使用gitee。 前边我们讲解了如何在本地进行操作&#xff0c; 接下来进…

golang创建式设计模式------单例模式

目录导航 1.单例模式1)什么是单例模式 2)使用场景3)实现方式1.懒汉式单例模式2.饿汉式3.双重检查式4.sysc.Once式 4)实践案例5)优缺点分析 1.单例模式 1)什么是单例模式 单例模式(Singleton Pattern)是一种常用的设计模式。单例模式的类提供了一种访问其唯一对象的方法&#…

牛客小白月赛90VP

1&#xff0c;签到&#xff1a;https://ac.nowcoder.com/acm/contest/78306/A AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int n,m,a[100010]; long long sum; int main() {cin>>n>>m;for(int i1;i<n;i) cin>>a[i];for(int …

[Algorithm][回溯][全排列][子集] + 回溯原理 详细讲解

目录 0.原理讲解1.全排列1.题目链接2.算法原理详解3.代码实现 2.子集1.题目链接2.算法原理详解3.代码实现 0.原理讲解 回溯算法通常⽤于解决组合问题、排列问题和搜索问题等回溯算法的基本思想&#xff1a; 从⼀个初始状态开始&#xff0c;按照⼀定的规则向前搜索&#xff0c;…

针对关键 PuTTY 私钥恢复漏洞的 PoC 发布

安全研究人员针对广泛使用的 PuTTY SSH 和 Telnet 客户端中的一个关键漏洞发布了概念验证 (PoC) 漏洞利用。 该漏洞CVE-2024-31497允许攻击者恢复 PuTTY 版本 0.68 至 0.80 中使用 NIST P-521 椭圆曲线生成的私钥。 该漏洞源于 PuTTY在使用 P-521 曲线时偏向生成ECDSA随机数。…

[FSCTF 2023]ez_php1

一共有三小关 第一关&#xff1a;md5加密 第二关&#xff1a;反序列化 重点 单个字符串序列化 unserialize($str) "$KEY" <?php $KEY"YES I love";echo serialize($KEY); s:10:"YES I love"; 第三关&#xff1a; 反序列化 把a的地址赋给…

【linux-IMX6ULL-RTC-IIC-SPI配置思路】

目录 1. RTC简介1.1 IMX6ULL中的RTC1.2 SNVS_LP中的SRTC配置流程1.3 程序实现 2. IIC通信协议2.1 IIC基础2.2 IIC通信协议2.2.1 IIC写时序2.2.2 IIC读时序 3. IIC通信的硬件框图及配置流程3.1 IMX6ULL的硬件IIC框图3.1 IIC配置流程3.2 硬件IIC代码实现 4. SPI通信4.1 SPI通信基…

在云计算与人工智能中,7ECloud扮演着什么样的角色

数据驱动的时代&#xff0c;云计算和人工智能已成为推动现代科技进步的两大引擎。作为一家专注于云计算的公司&#xff0c;7ECloud正是在这个领域发挥自己的力量&#xff0c;力图为企业提供一站式解决方案&#xff0c;并拥有来自厂家的源头支持&#xff0c;用极其低的价格助力企…

思源笔记如何结合群晖WebDav实现云同步数据

文章目录 1. 开启群晖WebDav 服务2. 本地局域网IP同步测试3. 群晖安装Cpolar4. 配置远程同步地址5. 笔记远程同步测试6. 固定公网地址7. 配置固定远程同步地址 在数字化时代&#xff0c;信息的同步与共享变得尤为重要。无论是个人用户还是企业团队&#xff0c;都渴望能够实现跨…

【Django学习笔记(九)】Flask + MySQL的结合案例

Flask MySQL结合案例 前言正文案例1&#xff1a;添加用户1.1 浏览器发送请求&#xff0c;返回页面main.pyhtml页面 1.2 新增用户并连接数据库main.pyhtml页面 案例2&#xff1a;查询所有用户2.1 main.py2.2 html2.3 bootstrap优化html 前言 在本文中&#xff0c;介绍如何将 F…

2023 PWNHUB 3月赛-【tototo】

文章目录 volatile泄露_environ打栈漏洞利用malloc和calloc思路&#xff08;打_environ&#xff09;代码 volatile int volatile vInt; 当要求使用 volatile 声明的变量值的时候&#xff0c;系统总是重新从它所在的内存读取数据&#xff0c;即使它前面的指令刚刚从该处读取过数…

01基础篇

1、初识 JVM 1.1 什么是 JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; 分为三个步骤&#xff1a; 编写Java源代码文件。使用…

CentOS使用Docker搭建Nacos结合内网穿透实现无公网IP远程登录本地管理平台

文章目录 1. Docker 运行Nacos2. 本地访问Nacos3. Linux安装Cpolar4. 配置Nacos UI界面公网地址5. 远程访问 Nacos UI界面6. 固定Nacos UI界面公网地址7. 固定地址访问Nacos Nacos是阿里开放的一款中间件,也是一款服务注册中心&#xff0c;它主要提供三种功能&#xff1a;持久化…