[转载]「服务」WCF中NetNamedPipeBinding的应用实例
「服务」WCF中NetNamedPipeBinding的应用实例
WCF中有很多种绑定,根据官方的说法,NetNamedPipeBinding是适用于同一台主机中不同进程之间的通信的。
今天终于实现了一个简单实例,整理一下。
1、服务端创建
首先要说一下,WCF服务是需要宿主程序的,可以寄宿在windows服务中、控制台中、桌面程序中……
看很多教程都是创建一个WCF项目,然后在创建一个其他项目去引用,实际摸索了一下,发现完全不用,直接在其他项目中去写相关代码即可。
依照个人喜好,我选择直接创建控制台项目。
例如:创建控制台项目【ConsolePipeWcf1】,添加【ConsoleServer1.cs】类 用于代码的方式配置服务,新建一个【Server1】的文件夹用于添加服务的接口和类:
- ConsolePipeWcf1 ┳
- ┣Program.cs --程序主入口
- ┣ConsoleServer1.cs --用于配置服务
- ┗┳Server1
- ┣Server1.cs --接口的实现
- ┗IServer1.cs --接口的定义
首先,实现服务的主要内容
接口【IServer1.cs】:
- using System.ServiceModel;
- namespace ConsolePipeWcf1.Server1
- {
- [ServiceContract]
- interface IServer1
- {
- [OperationContract]
- string GetData(int value);
- }
- }
【Server1.cs】:
- using System.Collections.Generic;
- using System.ServiceModel;
- namespace ConsolePipeWcf1.Server1
- {
- class Server1 : IServer1
- {
- public string GetData(int value)
- {
- //内容就敷衍一下吧
- return string.Format("2 * value = {0}", 2 * value);
- }
- }
- }
配置服务【ConsoleServer1.cs】:
(里面有些大括号只是为了代码好理解和方便查看加的)
- using System;
- using System.ServiceModel;
- using ConsolePipeWcf1.Server1;
- using System.ServiceModel.Description;
- namespace ConsolePipeWcf1
- {
- //创建一个服务类
- class ConsoleServer1
- {
- //基地址
- private Uri baseAddress;
- //终结点地址
- public string address;
- //服务主机实例
- public ServiceHost serviceHost;
- public ConsoleServer1()
- {
- baseAddress = new Uri("http://localhost:8010/console/server1/");
- address = "net.pipe://localhost/console/server1/";
- serviceHost = new ServiceHost(typeof(Server1.Server1), baseAddress);
- }
- public void CreatServer()
- {
- //NetNamedPipeBinding实例与配置
- NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.Transport);
- {
- binding.CloseTimeout = new TimeSpan(0, 1, 0);
- binding.OpenTimeout = new TimeSpan(0, 1, 0);
- binding.ReceiveTimeout = new TimeSpan(0, 10, 0);
- binding.SendTimeout = new TimeSpan(0, 1, 0);
- binding.TransactionFlow = false;
- binding.TransferMode = TransferMode.Buffered;
- binding.TransactionProtocol = TransactionProtocol.OleTransactions;
- binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
- binding.MaxBufferPoolSize = 424288;
- binding.MaxBufferSize = 65536;
- binding.MaxConnections = 10;
- binding.MaxReceivedMessageSize = 65536;
- }
- //Set Behavior
- {
- ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
- smb.HttpGetEnabled = false;
- smb.HttpsGetEnabled = false;
- serviceHost.Description.Behaviors.Add(smb);
- }
- //Add Endpoint
- {
- //添加 mex终结点
- serviceHost.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
- MetadataExchangeBindings.CreateMexHttpBinding(),
- "mex");
- //添加NetNamedPipeBinding的终结点
- serviceHost.AddServiceEndpoint(typeof(IServer1), binding, address);
- }
- }
- //打开服务
- public void OpenServer()
- {
- serviceHost.Open();
- Console.WriteLine("The service1 is ready.");
- }
- //关闭服务
- public void CloseServer()
- {
- serviceHost.Close();
- Console.WriteLine("The service1 is closed.");
- }
- }
- }
当然,以上代码也可以通过【App.Config】来实现,由于我的是控制台项目,默认的配置文件过于简单,可以新建个WCF项目把配置文件复制过来再改比较方便:
详见注释:
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <appSettings>省略</appSettings>
- <system.web>省略</system.web>
- <system.serviceModel>
- <services>
- <service name="ConsolePipeWcf1.Server1.Server1"><!--服务名要对!-->
- <host>
- <!--要有基地址-->
- <baseAddresses>
- <add baseAddress="http://localhost:8010/console/server1/" />
- </baseAddresses>
- </host>
- <!--添加netNamedPipeBinding终结点-->
- <endpoint address="net.pipe://localhost/console/server1/"
- binding="netNamedPipeBinding"
- contract="WCFNetNamedDemo.INnService">
- </endpoint>
- <!--mex终结点-->
- <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
- </service>
- </services>
- <bindings>
- <!--netNamedPipeBinding终结点设置-->
- <netNamedPipeBinding>
- <binding closeTimeout="00:01:00"
- openTimeout="00:01:00"
- receiveTimeout="00:10:00"
- sendTimeout="00:01:00"
- transactionFlow="false"
- transferMode="Buffered"
- transactionProtocol="OleTransactions"
- hostNameComparisonMode="StrongWildcard"
- maxBufferPoolSize="524288"
- maxBufferSize="65536"
- maxConnections="10"
- maxReceivedMessageSize="65536">
- <security mode="Transport">
- <transport protectionLevel="EncryptAndSign" />
- </security>
- </binding>
- </netNamedPipeBinding>
- </bindings>
- <behaviors>
- <serviceBehaviors>
- <behavior>
- <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/>
- </behavior>
- </serviceBehaviors>
- </behaviors>
- </system.serviceModel>
- </configuration>
最后就是宿主程序,也就是我的控制台主程序【Program.cs】:
- using System;
- namespace ConsolePipeWcf1
- {
- class Program
- {
- static void Main(string[] args)
- {
- //创建服务
- ConsoleServer1 server1 = new ConsoleServer1();
- server1.CreatServer();
- //到开服务
- server1.OpenServer();
- //随便输入什么就关闭
- Console.ReadLine();
- server1.CloseServer();
- }
- }
- }
完成以上,服务端就算完成。
2、客户端调用
新建控制台项目【ConsoleServer1Client】
把服务端的【IServer1.cs】接口文件(协议)复制过来,添加到项目中
然后:
- using System;
- //添加必要的引用
- using System.ServiceModel;
- //服务端IServer1的命名空间(由直接复制过来的IServer1.cs文件决定的)
- using ConsolePipeWcf1.Server1;
- namespace ConsoleServer1Client
- {
- class Program
- {
- static void Main(string[] args)
- {
- var binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.Transport);
- var address = new EndpointAddress("net.pipe://localhost/console/server1/");
- //创建通道
- var factory = new ChannelFactory<IServer1>(binding, address);
- IServer1 channel = factory.CreateChannel();
- //调用(因为有IServer1.cs文件,所以智能提示能提示出接口中的方法,不会报错)
- string s = channel.GetData(5);//随便给个数
- Console.WriteLine(s);
- Console.ReadKey();
- }
- }
- }
运行:

完成!
原文地址: 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的应用实例的更多相关文章
- 「翻译」Unity中的AssetBundle详解(二)
为AssetBundles准备资源 使用AssetBundles时,您可以随意将任何Asset分配给所需的任何Bundle.但是,在设置Bundles时,需要考虑一些策略.这些分组策略可以使用到任何你 ...
- 「翻译」Unity中的AssetBundle详解(一)
AssetBundles AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景).AssetBundles可以表示彼此之间的依赖关系;例如 ...
- 「JSOI2013」游戏中的学问
「JSOI2013」游戏中的学问 传送门 考虑 \(\text{DP}\) 设 \(dp_{i, j}\) 表示将前 \(i\) 个人分成 \(j\) 个集合,并且第 \(i\) 个人在第 \(j\) ...
- 「Kafka」Kafka中offset偏移量提交
在消费Kafka中分区的数据时,我们需要跟踪哪些消息是读取过的.哪些是没有读取过的.这是读取消息不丢失的关键所在. Kafka是通过offset顺序读取事件的.如果一个消费者退出,再重启的时候,它知道 ...
- 重温WCF之构建一个简单的WCF(一)(2)通过Windows Service寄宿服务和WCF中实现操作重载
参考地址:http://www.cnblogs.com/zhili/p/4039111.html 一.如何在Windows Services中寄宿WCF服务 第一步:创建Windows 服务项目,具体 ...
- 「Python-Django」Django中使用数据库的 9 个小技巧
Django 中使用数据库的 9 个小技巧. 1. 过滤器聚合 在 Django 2.0 之前,如果你想得到“用户总数”.“活跃用户总数”等信息时,你不得不使用条件表达式. Django 2.0 中, ...
- 「数据分析」Sqlserver中的窗口函数的精彩应用之数据差距与数据岛(含答案)
上一篇介绍过数据差距与数据岛的背景,这里不再赘述,请翻阅上一文.此篇在Sqlserver上给大家演示1000万条记录的计算性能. 测试电脑软硬件说明 一般般的笔记本电脑,2017年7月,价格:4500 ...
- 「数据分析」Sqlserver中的窗口函数的精彩应用-问题篇
最近看到PowerBI圈子在讨论最大连续区间段的问题,即某人最大的全勤时间,某人的最长的连续打卡时间等问题的计算,佐罗老师给出了10万倍性能的答案.这个问题也引发了笔者一些兴趣,隐约记得以前看过Sql ...
- 「MYSQL」MYSQL中的int(11)到底代表什么意思?
一.前言 在工作中经常要与mysql打交道,但是对mysql的各个字段类型一直都是一知半解,因此写本文总结记录一番. 二.简介 对于int类型的一些基础知识其实上图已经说的很明白了,在这里想讨论下常用 ...
- 「Flink」Flink中的时间类型
Flink中的时间类型和窗口是非常重要概念,是学习Flink必须要掌握的两个知识点. Flink中的时间类型 时间类型介绍 Flink流式处理中支持不同类型的时间.分为以下几种: 处理时间 Flink ...
随机推荐
- 【2024.9.30】NOIP2024 赛前集训-刷题训练(4)
[2024.9.30]NOIP2024 赛前集训-刷题训练(4) Problem - 2000D - Codeforces 给一串数和一串LR字符,L 可以向右连接 R, 覆盖部分的LR不能再使用,但 ...
- Nuxt.js 应用中的 schema:extend事件钩子详解
title: Nuxt.js 应用中的 schema:extend事件钩子详解 date: 2024/11/10 updated: 2024/11/10 author: cmdragon excerp ...
- 强行修改 User-Agent, 访问对应的端
location /{ proxy_pass http://localhost:18080; proxy_set_header User-Agent "Mozilla/5.0 (Window ...
- Pgloader极简教程
目录 简介 安装 安装概述 CentOS编译安装 使用 命令行 配置文件迁移 可能遇到的错误 更多配置参考 总结 引用 简介 pgloader是一个数据同步工具,用来将数据从其它地方迁移到postgr ...
- 能不能用uni开发一个线上运动会的APP、小程序?
引言:uni-app凭借其强大的跨平台能力,成为开发AI运动类APP和小程序的首选框架.本文旨在探讨基于uni进行开发AI运动小程序.APP开发,以及开发过程中遇到的技术难点,并为您介绍一个开箱即用的 ...
- 为什么Spring官方不推荐使用 @Autowired?
前言 很多人刚接触 Spring 的时候,对 @Autowired 绝对是爱得深沉. 一个注解,轻松搞定依赖注入,连代码量都省了. 谁不爱呢? 但慢慢地,尤其是跑到稍微复杂点的项目里,@Autowir ...
- springboot 参数注解 注入参数
什么时注解参数 说明 我们在 使用spring mvc 的时候会使用这样的注解 @ResponseBody 这样,spring mvc 会将 客户端传来的数据,自动构建成 相应类型的对象. 有些情况下 ...
- C/C++源码扫描系列- Joern 篇
文章首发于 https://xz.aliyun.com/t/9277 概述 和 codeql,Fortify 相比 Joern不需要编译源码即可进行扫描,适用场景和环境搭建方面更加简单. 环境搭建 首 ...
- 推荐一款强大的开源物联网 Web 组态软件
前言 快速发展的物联网(IoT)领域,设备管理和监控的需求日益增长.为了满足这一需求并提供更高效的解决方案. 向大家推荐一款强大的开源物联网Web组态软件.这款软件不仅具备灵活的可视化配置功能,还提供 ...
- openEuler欧拉配置nginx Keepalived主从和双主
虚拟:172.62.17.110 Nginx主:172.62.17.111 Nginx从:172.62.17.112 一.系统优化 关闭防火墙(两台) systemctl stop firewall ...