回《【开源】EFW框架系列文章索引》       

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服务通讯和实现思路的更多相关文章

  1. 三十一、【WCF路由中间件】WCFHosting服务主机的路由器与负载均衡和实现思路

    回<[开源]EFW框架系列文章索引> EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://pan.baid ...

  2. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  3. WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载]

    原文:WCF技术剖析之二十九:换种不同的方式调用WCF服务[提供源代码下载] 我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码 ...

  4. Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务、WCF消息头添加安全验证Token

    原文:Prism for WPF 搭建一个简单的模块化开发框架(四)异步调用WCF服务.WCF消息头添加安全验证Token 为什么选择wcf?   因为好像wcf和wpf就是哥俩,,, 为什么选择异步 ...

  5. 风炫安全web安全学习第三十三节课 文件包含漏洞基础以及利用伪协议进行攻击

    风炫安全web安全学习第三十三节课 文件包含漏洞基础以及利用伪协议进行攻击 文件包含漏洞 参考文章:https://chybeta.github.io/2017/10/08/php文件包含漏洞/ 分类 ...

  6. Windows 服务为宿主的WCF服务,详细图解。

    废话不多说,直接进入主题: 1.打开vs2010新建项目,选择Windows服务. 2.选中WindowsService右击,添加WCF服务. 3.添加成功后,为下图.将接口类ITestService ...

  7. 编写WCF服务时右击配置文件无“Edit WCF Configuration”(编辑 WCF 配置)远程的解决办法

    原文:编写WCF服务时右击配置文件无“Edit WCF Configuration”远程的解决办法 今天在看<WCF揭秘>书中看到作者提出可以在一个WCF Host应用程序的App.Con ...

  8. WCF开发实战系列三:自运行WCF服务

    WCF开发实战系列三:自运行WCF服务 (原创:灰灰虫的家 http://hi.baidu.com/grayworm)上一篇文章中我们建立了一个WCF服务站点,为WCF服务库运行提供WEB支持,我们把 ...

  9. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

随机推荐

  1. Mac系统下lipo, ar, nm等工具的使用简介

    引言 开发第三方库时, 如果没有进行特殊处理, 很容易把其他第三方库的符号暴露出来, 导致链接时产生符号重复. 如下图所示 如果用户链接了其他版本的libjpeg, 会因为入口地址不正确让程序直接崩溃 ...

  2. paip.php 与js 的相似性以及为什么它们这么烂还很流行。。

    paip.php 与js 的相似性以及为什么它们这么烂还很流行.. php与js异常的流行,web 90%都被他们统治了.发现了他们有意思的一些共性.. 结构一番总结,得出了它们共有的特点.特性: = ...

  3. Hibernate入门6.Hibernate检索方式

    Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...

  4. (谷歌浏览器等)解决css中点击input输入框时出现外边框方法【outline:medium;】

    问题:在使用谷歌浏览器,360浏览器时,点击input输入框会出现带颜色的外边框,如下图所示:

  5. VC基于消息的异步套接字

    用WSAStartup,需要在StdAfx.h头文件中需要声明 #include    #pragma   comment(lib,"WS2_32.lib") 用AfxSocket ...

  6. sqlserver数据库安全函数、配置函数、游标函数、行级函数、排名函数、元数据函数、系统统计函数 、文本和图像函数--收藏着有用

    行级函数:下列行集函数将返回一个可用于代替 Transact-SQL 语句中表引用的对象. CONTAINSTABLE 返回具有零行.一行或多行的表,这些行的列中包含的基于字符类型的数据是单个词语和短 ...

  7. 一个简单的JavaScript Map

    用js写了一个Map,带遍历功能,请大家点评下啦. //map.js Array.prototype.remove = function(s) { for (var i = 0; i < thi ...

  8. [算法导论]DFS @ Python

    class Graph: def __init__(self): self.V = [] class Vertex: def __init__(self, x): self.key = x self. ...

  9. Redmine性能优化方案

    近来公司redmine服务器表现很糟糕,在16核,64GRAM的机器上,压测结果竟然只有每秒5~7个请求,部分页面一个都出不来. 以下是我对Redmine性能优化方案: redmine服务器性能问题排 ...

  10. RabbitMQ学习笔记5-简单的RPC调用

    利用空的queue名字("")让rabbitMQ生成一个唯一的队列名称,同时指定队列是:临时的(auto-delete).私有的(exclusive). 在发送的RPC调用消息里设 ...