「服务」WCF中NetNamedPipeBinding的应用实例

WCF中有很多种绑定,根据官方的说法,NetNamedPipeBinding是适用于同一台主机中不同进程之间的通信的。

今天终于实现了一个简单实例,整理一下。

1、服务端创建

首先要说一下,WCF服务是需要宿主程序的,可以寄宿在windows服务中、控制台中、桌面程序中……

看很多教程都是创建一个WCF项目,然后在创建一个其他项目去引用,实际摸索了一下,发现完全不用,直接在其他项目中去写相关代码即可。

依照个人喜好,我选择直接创建控制台项目。

例如:创建控制台项目【ConsolePipeWcf1】,添加【ConsoleServer1.cs】类 用于代码的方式配置服务,新建一个【Server1】的文件夹用于添加服务的接口和类:

  1.  
    ConsolePipeWcf1 ┳
  2.  
    ┣Program.cs --程序主入口
  3.  
    ┣ConsoleServer1.cs --用于配置服务
  4.  
    ┗┳Server1
  5.  
    ┣Server1.cs --接口的实现
  6.  
    ┗IServer1.cs --接口的定义

首先,实现服务的主要内容

接口【IServer1.cs】:

  1.  
    using System.ServiceModel;
  2.  
     
  3.  
    namespace ConsolePipeWcf1.Server1
  4.  
    {
  5.  
    [ServiceContract]
  6.  
    interface IServer1
  7.  
    {
  8.  
    [OperationContract]
  9.  
    string GetData(int value);
  10.  
    }
  11.  
    }

【Server1.cs】:

  1.  
    using System.Collections.Generic;
  2.  
    using System.ServiceModel;
  3.  
     
  4.  
    namespace ConsolePipeWcf1.Server1
  5.  
    {
  6.  
    class Server1 : IServer1
  7.  
    {
  8.  
    public string GetData(int value)
  9.  
    {
  10.  
    //内容就敷衍一下吧
  11.  
    return string.Format("2 * value = {0}", 2 * value);
  12.  
    }
  13.  
    }
  14.  
    }

配置服务【ConsoleServer1.cs】:

(里面有些大括号只是为了代码好理解和方便查看加的)

  1.  
    using System;
  2.  
    using System.ServiceModel;
  3.  
    using ConsolePipeWcf1.Server1;
  4.  
    using System.ServiceModel.Description;
  5.  
     
  6.  
    namespace ConsolePipeWcf1
  7.  
    {
  8.  
    //创建一个服务类
  9.  
    class ConsoleServer1
  10.  
    {
  11.  
    //基地址
  12.  
    private Uri baseAddress;
  13.  
    //终结点地址
  14.  
    public string address;
  15.  
    //服务主机实例
  16.  
    public ServiceHost serviceHost;
  17.  
     
  18.  
    public ConsoleServer1()
  19.  
    {
  20.  
    baseAddress = new Uri("http://localhost:8010/console/server1/");
  21.  
    address = "net.pipe://localhost/console/server1/";
  22.  
    serviceHost = new ServiceHost(typeof(Server1.Server1), baseAddress);
  23.  
    }
  24.  
     
  25.  
    public void CreatServer()
  26.  
    {
  27.  
    //NetNamedPipeBinding实例与配置
  28.  
    NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.Transport);
  29.  
    {
  30.  
    binding.CloseTimeout = new TimeSpan(0, 1, 0);
  31.  
    binding.OpenTimeout = new TimeSpan(0, 1, 0);
  32.  
    binding.ReceiveTimeout = new TimeSpan(0, 10, 0);
  33.  
    binding.SendTimeout = new TimeSpan(0, 1, 0);
  34.  
    binding.TransactionFlow = false;
  35.  
    binding.TransferMode = TransferMode.Buffered;
  36.  
    binding.TransactionProtocol = TransactionProtocol.OleTransactions;
  37.  
    binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
  38.  
    binding.MaxBufferPoolSize = 424288;
  39.  
    binding.MaxBufferSize = 65536;
  40.  
    binding.MaxConnections = 10;
  41.  
    binding.MaxReceivedMessageSize = 65536;
  42.  
    }
  43.  
    //Set Behavior
  44.  
    {
  45.  
    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
  46.  
    smb.HttpGetEnabled = false;
  47.  
    smb.HttpsGetEnabled = false;
  48.  
    serviceHost.Description.Behaviors.Add(smb);
  49.  
    }
  50.  
    //Add Endpoint
  51.  
    {
  52.  
    //添加 mex终结点
  53.  
    serviceHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
  54.  
    MetadataExchangeBindings.CreateMexHttpBinding(),
  55.  
    "mex");
  56.  
    //添加NetNamedPipeBinding的终结点
  57.  
    serviceHost.AddServiceEndpoint(typeof(IServer1), binding, address);
  58.  
    }
  59.  
    }
  60.  
     
  61.  
    //打开服务
  62.  
    public void OpenServer()
  63.  
    {
  64.  
    serviceHost.Open();
  65.  
    Console.WriteLine("The service1 is ready.");
  66.  
    }
  67.  
     
  68.  
    //关闭服务
  69.  
    public void CloseServer()
  70.  
    {
  71.  
    serviceHost.Close();
  72.  
    Console.WriteLine("The service1 is closed.");
  73.  
    }
  74.  
    }
  75.  
    }

当然,以上代码也可以通过【App.Config】来实现,由于我的是控制台项目,默认的配置文件过于简单,可以新建个WCF项目把配置文件复制过来再改比较方便:

详见注释:

  1.  
    <?xml version="1.0" encoding="utf-8" ?>
  2.  
    <configuration>
  3.  
    <appSettings>省略</appSettings>
  4.  
    <system.web>省略</system.web>
  5.  
    <system.serviceModel>
  6.  
    <services>
  7.  
    <service name="ConsolePipeWcf1.Server1.Server1"><!--服务名要对!-->
  8.  
    <host>
  9.  
    <!--要有基地址-->
  10.  
    <baseAddresses>
  11.  
    <add baseAddress="http://localhost:8010/console/server1/" />
  12.  
    </baseAddresses>
  13.  
    </host>
  14.  
    <!--添加netNamedPipeBinding终结点-->
  15.  
    <endpoint address="net.pipe://localhost/console/server1/"
  16.  
    binding="netNamedPipeBinding"
  17.  
    contract="WCFNetNamedDemo.INnService">
  18.  
    </endpoint>
  19.  
    <!--mex终结点-->
  20.  
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  21.  
    </service>
  22.  
    </services>
  23.  
    <bindings>
  24.  
    <!--netNamedPipeBinding终结点设置-->
  25.  
    <netNamedPipeBinding>
  26.  
    <binding closeTimeout="00:01:00"
  27.  
    openTimeout="00:01:00"
  28.  
    receiveTimeout="00:10:00"
  29.  
    sendTimeout="00:01:00"
  30.  
    transactionFlow="false"
  31.  
    transferMode="Buffered"
  32.  
    transactionProtocol="OleTransactions"
  33.  
    hostNameComparisonMode="StrongWildcard"
  34.  
    maxBufferPoolSize="524288"
  35.  
    maxBufferSize="65536"
  36.  
    maxConnections="10"
  37.  
    maxReceivedMessageSize="65536">
  38.  
    <security mode="Transport">
  39.  
    <transport protectionLevel="EncryptAndSign" />
  40.  
    </security>
  41.  
    </binding>
  42.  
    </netNamedPipeBinding>
  43.  
    </bindings>
  44.  
    <behaviors>
  45.  
    <serviceBehaviors>
  46.  
    <behavior>
  47.  
    <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/>
  48.  
    </behavior>
  49.  
    </serviceBehaviors>
  50.  
    </behaviors>
  51.  
    </system.serviceModel>
  52.  
    </configuration>

最后就是宿主程序,也就是我的控制台主程序【Program.cs】:

  1.  
    using System;
  2.  
     
  3.  
    namespace ConsolePipeWcf1
  4.  
    {
  5.  
    class Program
  6.  
    {
  7.  
    static void Main(string[] args)
  8.  
    {
  9.  
    //创建服务
  10.  
    ConsoleServer1 server1 = new ConsoleServer1();
  11.  
    server1.CreatServer();
  12.  
    //到开服务
  13.  
    server1.OpenServer();
  14.  
    //随便输入什么就关闭
  15.  
    Console.ReadLine();
  16.  
    server1.CloseServer();
  17.  
    }
  18.  
    }
  19.  
    }

完成以上,服务端就算完成。

2、客户端调用

新建控制台项目【ConsoleServer1Client】

把服务端的【IServer1.cs】接口文件(协议)复制过来,添加到项目中

然后:

  1.  
    using System;
  2.  
    //添加必要的引用
  3.  
    using System.ServiceModel;
  4.  
    //服务端IServer1的命名空间(由直接复制过来的IServer1.cs文件决定的)
  5.  
    using ConsolePipeWcf1.Server1;
  6.  
     
  7.  
    namespace ConsoleServer1Client
  8.  
    {
  9.  
    class Program
  10.  
    {
  11.  
    static void Main(string[] args)
  12.  
    {
  13.  
    var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.Transport);
  14.  
    var address = new EndpointAddress("net.pipe://localhost/console/server1/");
  15.  
    //创建通道
  16.  
    var factory = new ChannelFactory<IServer1>(binding, address);
  17.  
    IServer1 channel = factory.CreateChannel();
  18.  
    //调用(因为有IServer1.cs文件,所以智能提示能提示出接口中的方法,不会报错)
  19.  
    string s = channel.GetData(5);//随便给个数
  20.  
    Console.WriteLine(s);
  21.  
    Console.ReadKey();
  22.  
    }
  23.  
    }
  24.  
    }

运行:

完成!

原文地址: https://blog.csdn.net/Raink_LH/article/details/103721408

最后,如果用App.Config文件配置的话就不需要 CreatServer 这个方法了,

这种情况启动服务如下(因为配置server,endpoint 等信息已在App.Config文件):

static void Main(string[] args)
{
ServiceHost serviceHost = new ServiceHost(typeof(Services.CalculatorService));
//到开服务
serviceHost.Open();
Console.WriteLine("server start.......");
//随便输入什么就关闭
Console.ReadLine();
serviceHost.Close();

}

[转载]「服务」WCF中NetNamedPipeBinding的应用实例的更多相关文章

  1. 「翻译」Unity中的AssetBundle详解(二)

    为AssetBundles准备资源 使用AssetBundles时,您可以随意将任何Asset分配给所需的任何Bundle.但是,在设置Bundles时,需要考虑一些策略.这些分组策略可以使用到任何你 ...

  2. 「翻译」Unity中的AssetBundle详解(一)

    AssetBundles AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景).AssetBundles可以表示彼此之间的依赖关系;例如 ...

  3. 「JSOI2013」游戏中的学问

    「JSOI2013」游戏中的学问 传送门 考虑 \(\text{DP}\) 设 \(dp_{i, j}\) 表示将前 \(i\) 个人分成 \(j\) 个集合,并且第 \(i\) 个人在第 \(j\) ...

  4. 「Kafka」Kafka中offset偏移量提交

    在消费Kafka中分区的数据时,我们需要跟踪哪些消息是读取过的.哪些是没有读取过的.这是读取消息不丢失的关键所在. Kafka是通过offset顺序读取事件的.如果一个消费者退出,再重启的时候,它知道 ...

  5. 重温WCF之构建一个简单的WCF(一)(2)通过Windows Service寄宿服务和WCF中实现操作重载

    参考地址:http://www.cnblogs.com/zhili/p/4039111.html 一.如何在Windows Services中寄宿WCF服务 第一步:创建Windows 服务项目,具体 ...

  6. 「Python-Django」Django中使用数据库的 9 个小技巧

    Django 中使用数据库的 9 个小技巧. 1. 过滤器聚合 在 Django 2.0 之前,如果你想得到“用户总数”.“活跃用户总数”等信息时,你不得不使用条件表达式. Django 2.0 中, ...

  7. 「数据分析」Sqlserver中的窗口函数的精彩应用之数据差距与数据岛(含答案)

    上一篇介绍过数据差距与数据岛的背景,这里不再赘述,请翻阅上一文.此篇在Sqlserver上给大家演示1000万条记录的计算性能. 测试电脑软硬件说明 一般般的笔记本电脑,2017年7月,价格:4500 ...

  8. 「数据分析」Sqlserver中的窗口函数的精彩应用-问题篇

    最近看到PowerBI圈子在讨论最大连续区间段的问题,即某人最大的全勤时间,某人的最长的连续打卡时间等问题的计算,佐罗老师给出了10万倍性能的答案.这个问题也引发了笔者一些兴趣,隐约记得以前看过Sql ...

  9. 「MYSQL」MYSQL中的int(11)到底代表什么意思?

    一.前言 在工作中经常要与mysql打交道,但是对mysql的各个字段类型一直都是一知半解,因此写本文总结记录一番. 二.简介 对于int类型的一些基础知识其实上图已经说的很明白了,在这里想讨论下常用 ...

  10. 「Flink」Flink中的时间类型

    Flink中的时间类型和窗口是非常重要概念,是学习Flink必须要掌握的两个知识点. Flink中的时间类型 时间类型介绍 Flink流式处理中支持不同类型的时间.分为以下几种: 处理时间 Flink ...

随机推荐

  1. 银河麒麟操作系统root用户登录图形化界面

    第一步.为root用户设置密码 sudo passwd 设置root用户密码 第二步.开启root登录权限 vim /usr/share/lightdm/lightdm.conf.d/60-kylin ...

  2. 5.7 Linux Vim可视化模式

    相信大家都使用过带图形界面的操作系统中的文字编辑器,用户可以使用鼠标来选择要操作的文本,非常方便.在 Vim 编辑器中也有类似的功能,但不是通过鼠标,而是通过键盘来选择要操作的文本. 在 Vim 中, ...

  3. 想要硬件设计不用愁?首先要搞懂这三类GPIO!

    合宙低功耗4G模组经典型号Air780E,支持两种软件开发方式: 一种是传统的AT指令:一种是基于模组做Open开发. 传统AT指令的开发方式,合宙模组与行业内其它模组品牌在软件上区别不大,在硬件功耗 ...

  4. .NET +Vue 开发的高级报表工具

    前言 本文介绍一款基于 .NET 6 开发的高级报表工具.该工具支持多种数据源(如数据库.Excel 文件.API 服务等),并具备强大的数据处理和可视化功能.通过内置的集合函数和类 Excel 界面 ...

  5. 2.TP6的入门-分页类的改写

    看了看推荐的分页类的使用,还是很简单的,可是自己去尝试改写生成的分页类结构就会很麻烦,总是不成功,后来发现手册里面还有这个 就说你想重写分页类,就需要这样做 赶紧实践了一下,先改这里的provider ...

  6. 不依赖 Spring,你会如何自实现 RabbitMQ 消息的消费(一)

    开心一刻 上午一好哥们微信我哥们:哥们在干嘛,晚上出来吃饭我:就我俩吗哥们:对啊我:那多没意思,我叫俩女的出来哥们:好啊,哈哈哈晚上吃完饭到家后,我给哥们发消息我:今天吃的真开心,下次继续哥们:开心尼 ...

  7. 在matlab中使用遗传算法执行最优化

    遗传算法是一种通用的最优化方法,具体原理可以看:遗传算法详解与实验.下面记录在Matlab中如何使用遗传算法来做优化. 用法 调用方式如下: 1 x = ga(fun,nvars) 2 x = ga( ...

  8. (Python基础教程之三)Python代码中添加注释

    Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...

  9. 推荐给初级Java程序员的3本进阶书

    ImportNew 注: 原作者在这篇文章中介绍3本不错的技术书籍.作者认为这些书籍对新手或者学生而言尤其有帮助.通过一些基础性的教程入门后,我们可以使用Java做基础性的编程.然而,当我们需要从初级 ...

  10. 试了下Cursor,感觉程序员工种危险了

    大家好,我是汤师爷~ 今年8月份,AI 编程工具 Cursor 在开发者社区彻底火了.在 Twitter 平台上,Cloudflare 副总裁分享了一段视频,展示了一个令人震惊的案例.他年仅 8 岁的 ...