三十、【C#.Net开发框架】WCFHosting服务主机的利用WCF服务通讯和实现思路
EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0
EFW框架实例源代码下载:http://pan.baidu.com/s/1eQCc69G
前言:以前的系统都是直接客户端直连数据库服务器,后来考虑到服务器的安全性、数据库连接数的限制、分布能力差等问题,特别是那几年中间件、SOA、ESB等炒得比较火,为了跟上时代脚本有必要开发一个中间件,把后台逻辑业务在中间件中运行。刚开始考虑过WebServices,但是需要部署在IIS中,还有性能问题都比较严重,试了一下效果不是很好,后来觉得WCF不错,但一直没有找到好的方式怎么与现有的架构结合,如果把业务代码全改写成WCF服务方式提供给客户端调用,感觉工作量很大,光看着WCF那些配置文件就头大,特别是破坏了现有程序架构,这样使用WCF对现有框架也没什么意义。后来在完善Web版框架中从HttpHandlers中找到了思路,发现没有必要把业务功能做成WCF服务,而WCF服务只是用来实现客户端与后台业务的通讯,这样中间件只需要一个WCF服务用来连接客户端控制器与服务端控制器,把Winform版控制器层也分拆成wcfclientController与wcfController。这样原来的程序结构基本没变,保证了Web版、Winform版、WCF版三种类型系统的程序架构,编码风格等都一致,让EFW框架全面支持多种系统开发;
本文要点:
1.WCFHosting服务主机介绍
2.WCFHosting服务主机实现
3.WCFHosting服务主机必须解决的两个问题
4.总结
1.WCFHosting服务主机介绍
WCFHosting程序只是一个WCF自托管宿主,当然你可以修改此程序让WCF服务托管在IIS或Windows Services中,WCFHosting程序只有三个核心功能:WCFHandlerService服务用来实现客户端与服务端通讯,RemoteLoader用来实现访问对应的服务端控制器程序,Router服务用来实现中间件的连接路由和负载均衡。
源代码项目解决方案目录:
WCFHosting程序界面
配置文件说明,包括客户端的App.Config和服务端的App.Config两个配置文件
1)客户端的App.Config
主要是ClientType参数和WCF_endpoint参数的设置,ClientType必须设置为WCFClient,WCF_endpoint设置为WCF地址;
2)服务端的App.Config
2.WCFHosting服务主机实现
1)FrmHosting.cs界面,启动、停止WCF服务
启动的时候可以根据设置里的配置开启相应功能,比如:
显示调试信息,那么每个客户端每次与服务端交互的内容都会在日志界面显示出来
开启WCF服务,如果此主机是作为系统的中间件那么必须勾上此处
开启路由服务,如果此主机设置为路由器那么必须勾上此处
开启心跳检测,正式使用的系统必须勾上次处,如果是开发阶段的时候可以不勾,便于调试程序
2)WCFHandlerService服务,客户端通过调用此wcf服务连接、执行、断开与中间件通讯
WCFHandlerService服务的IapiWCFHandlerService契约使用了CallbackContract回调操作,这样实现了客户端与服务端之间双向通讯,服务端可以主动向客户端发送数据,这是Web程序没有的功能,Web程序只能通过定时访问来实现此功能。
WCFHandlerService服务对象有5个核心方法,
CreateDomain:打开客户端(EFWWin.exe程序)会调用此方法在服务端创建在线用户
ProcessRequest:客户端调用此方法访问服务端控制器代码
UnDomain:客户端(EFWWin.exe程序)退出前调用此方法清除服务端在线用户
Heartbeat:客户端像心跳一样,调用此方法定时向服务端发送在线状态
SendBroadcast:服务端向客户端发送消息
3)Loader对象,管理每个连接的客户端,并通过反射调用wcf控制器
4)BaseWCFClientController客户端控制器基类
5)BaseWCFController服务端控制器基类
6)JsonWCFController客户端与服务端数据交换基于Json字符串格式
7)Router服务,中间件路由功能及负载均衡实现
3.WCFHosting服务主机必须解决的两个问题
问题一:由于网络中断问题等问题引起通讯错误,再恢复之后必须可以继续使用,不需要关闭系统重新登录系统;再就是wcf服务器主机必须反馈此客户机是断开状态;
问题二:由于WCF主机异常奔溃,再重启后能重新接管以前连接到此主机的所有客户端连接;不需要客户端退出系统重新启动;
解决问题的办法:
问题一,增加心跳机制,让客户端定时向wcf主机发送一条消息,如果超时没有接收到就证明客户端断开了连接;解决网络中断客户端自动重连服务端,首先客户端设置为取消服务器凭据认证,再就是客户端调用重连方法;
<netTcpBinding>
<binding name="netTcpExpenseService_ForSupplier" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10"
maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647" maxArrayLength="2147483647"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="None">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
/// <summary>
/// 重新连接wcf服务
/// </summary>
/// <param name="mainfrm"></param>
public static void ReConnectionWCFService(IClientService mainfrm)
{
try
{
NetTcpBinding binding = new NetTcpBinding("NetTcpBinding_WCFHandlerService");
//binding.OpenTimeout = TimeSpan.FromSeconds(10);
//binding.TransferMode = TransferMode.Buffered;
DuplexChannelFactory<IapiWCFHandlerService> mChannelFactory = new DuplexChannelFactory<IapiWCFHandlerService>(mainfrm, binding, System.Configuration.ConfigurationSettings.AppSettings["WCF_endpoint"]);
IapiWCFHandlerService wcfHandlerService = mChannelFactory.CreateChannel(); using (var scope = new OperationContextScope(wcfHandlerService as IContextChannel))
{
var router = System.ServiceModel.Channels.MessageHeader.CreateHeader("routerID", myNamespace, AppGlobal.cache.GetData("routerID").ToString());
OperationContext.Current.OutgoingMessageHeaders.Add(router);
wcfHandlerService.Heartbeat(AppGlobal.cache.GetData("WCFClientID").ToString());
} if (AppGlobal.cache.Contains("WCFService")) AppGlobal.cache.Remove("WCFService");
AppGlobal.cache.Add("WCFService", wcfHandlerService); //开启发送心跳
//if (timer == null)
// StartSendWCFHeartbeat();
//else
// timer.Start();
}
catch { }
}
问题二,必须解决中间件能够把缓存的客户端信息进行持久化,重新启动中间件又能加载非正常退出的客户端信息;
4.总结
WCF中间件基本功能都已具备,实现了客户端与服务端的通讯,实现服务端分布式部署与负载均衡。但中间件还是非常简陋的,如持久化客户端连接数据、更加灵活的负载均衡算法等还有许多功能需要不断完善。中间件路由与负载均衡的实现下一章详细讲解。
三十、【C#.Net开发框架】WCFHosting服务主机的利用WCF服务通讯和实现思路的更多相关文章
- 三十一、【WCF路由中间件】WCFHosting服务主机的路由器与负载均衡和实现思路
回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://pan.baid ...
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...
- WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]
原文:WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载] 我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码 ...
- Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务、WCF消息头添加安全验证Token
原文:Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务.WCF消息头添加安全验证Token 为什么选择wcf? 因为好像wcf和wpf就是哥俩,,, 为什么选择异步 ...
- 风炫安全web安全学习第三十三节课 文件包含漏洞基础以及利用伪协议进行攻击
风炫安全web安全学习第三十三节课 文件包含漏洞基础以及利用伪协议进行攻击 文件包含漏洞 参考文章:https://chybeta.github.io/2017/10/08/php文件包含漏洞/ 分类 ...
- Windows 服务为宿主的WCF服务,详细图解。
废话不多说,直接进入主题: 1.打开vs2010新建项目,选择Windows服务. 2.选中WindowsService右击,添加WCF服务. 3.添加成功后,为下图.将接口类ITestService ...
- 编写WCF服务时右击配置文件无“Edit WCF Configuration”(编辑 WCF 配置)远程的解决办法
原文:编写WCF服务时右击配置文件无“Edit WCF Configuration”远程的解决办法 今天在看<WCF揭秘>书中看到作者提出可以在一个WCF Host应用程序的App.Con ...
- WCF开发实战系列三:自运行WCF服务
WCF开发实战系列三:自运行WCF服务 (原创:灰灰虫的家 http://hi.baidu.com/grayworm)上一篇文章中我们建立了一个WCF服务站点,为WCF服务库运行提供WEB支持,我们把 ...
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
随机推荐
- 有关CSS中字体响应式的设置
在进行页面响应式设计中,往往需要根据屏幕分辨率来显示不同大小的字体.通常的做法是通过media queries给不同的分辨率指定不同的字体样式,例如: body { font-size: 22px; ...
- little skill---ping
一.ping简介 Ping是Windows下的一个命令,在Unix和Linux下也有这个命令. ping也属于一个通信协议,是TCP/IP协议的一部分. 利用“ping”命令可以检查网络是否连通,可以 ...
- Windows下安装Ruby
Ruby是一门用了就会喜欢的语言,在Ruby的社区里面,只要你觉得用的不习惯,这就是BUG. 下载 登录官方网址, 下载后,直接无脑下一步安装就行. 中间直接勾选add to PATH,可以自动添加到 ...
- Bootstrap的学习以及简单运用
<!DOCTYPE html> <html> <head> <title>柠檬学院</title> <meta charset=&qu ...
- JS_Ajax基础
一:Ajax ajax 的全称是Asynchronous(异步) JavaScript and XML 在不刷新页面的情况下从服务器获取,提交数据的一种数据交互方式; 二:Ajax使用步骤概括 //1 ...
- 解决安卓SDK更新连不通问题
http://wenku.baidu.com/link?url=d7t81OFF4_o2YF9iBne-azyovROGPGOozMgWKNyAIQK8vtI0mIjvzpfdOXg7KOobu202 ...
- Java和.net常用开发框架组合
Java: SSH和SSM 1.SSH是Spring(控制)+Struts(展现)+Hibernate(ORM)的缩写:此组合更严谨,适合企业级行业开发等等.2.SSM是Spring(控制)+Spri ...
- 阿里云产品介绍(二):云服务器ECS的孪生兄弟们
上一篇介绍的云服务器ECS,是阿里云最基础的产品,也是每一个云计算厂商最基础的产品,俗称爆款.除了标准的云服务器,阿里云也不停的在推出面向特殊业务场地的云服务器,可以说是ECS的孪生兄弟们. 这一篇就 ...
- go语言实现一个简单的登录注册web小程序
最近学习golang也有一段时间了,基础差不多学了个大概,因为本人是java程序员,所以对web更感兴趣.根据<go web编程>中的例子改编一个更简单的例子,供新手参考,废话不多说,上菜 ...
- fidder 抓 https包配置方法(ios & android & pc浏览器)
1. fidder抓https包的基本配置,可参见以下博文 http://blog.csdn.net/idlear/article/details/50999490 2. 遇到问题:抓包看只有Tunn ...