WCF 自承载 提供源码
| 一、WCF 简单介绍 |
| Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,是一套通讯接口。现在比较流行的SOA就可以通过WCF实现。他的功能如果非要用一个词来形容恐怕只能用“强大”,“完美”来形容。融合了remoting和webservices的强大功能,还推出了WCF配置的小工具,更加方便入手和进阶。 |
WCF 体系结构
|
| 二、今天想说的 |
| 1、Wcf经常需要添加新功能,需要发布新功能与修改配置文件 |
| 2、需要配置的信息很有特点(基本就是service,endpoint) |
| 3、配置多了,真的很烦,而且一不小心要是写错了就,糟糕了 |
| 进入主题啦,我们要说的是WCF自承载 |
| 三、WCF自承载 |
1、简单实现
ServiceHost host = new ServiceHost(typeof(Service1));
WSHttpBinding nb = new WSHttpBinding(SecurityMode.None);
host.AddServiceEndpoint(iType, nb, "http://127.0.0.1:8888/IService1");
host.Open();
这样就可以简单实现自承载了,现实中除了Http我们还经常用到Http |
//添加支持TCP协议服务
private static void AddTcpServer(Type type, Type iType)
{
ServiceHost host = new ServiceHost(type);
NetTcpBinding nb = new NetTcpBinding(SecurityMode.None);
host.AddServiceEndpoint(iType, nb, string.Concat("net.tcp://", Ip, ":", TcpPort, "/", iType.Name));
OpenServer(host, type.Name + "Tcp服务");
}
//添加支持HTTP协议服务
private static void AddHttpServer(Type type, Type iType)
{
ServiceHost host = new ServiceHost(type);
WSHttpBinding nb = new WSHttpBinding(SecurityMode.None);
host.AddServiceEndpoint(iType, nb, string.Concat("http://", Ip, ":", HttpPort, "/", iType.Name));
OpenServer(host, type.Name + "Http服务");
}
|
| 2、平常用较常用的有可以通过防火墙的HTTP协议,和效率很高的TCP |
private static void AddServer(Type type, Type iType)
{
ServiceHost host = new ServiceHost(type);
NetTcpBinding nb = new NetTcpBinding(SecurityMode.None);
host.AddServiceEndpoint(iType, nb, string.Concat("net.tcp://", Ip, ":", TcpPort, "/", iType.Name));
host.Opening += delegate { Console.WriteLine(DateTime.Now.ToString() + " Http服务启动中" + "\r\n"); };
host.Opening += delegate { Console.WriteLine(DateTime.Now.ToString() + " Http服务已经启动" + "\r\n"); };
host.Open();
ServiceHost host1 = new ServiceHost(type);
WSHttpBinding nb1 = new WSHttpBinding(SecurityMode.None);
host1.AddServiceEndpoint(iType, nb1, string.Concat("http://", Ip, ":", HttpPort, "/", iType.Name));
host1.Opening += delegate { Console.WriteLine(DateTime.Now.ToString() + " Http服务启动中" + "\r\n"); };
host1.Opening += delegate { Console.WriteLine(DateTime.Now.ToString() + " Http服务已经启动" + "\r\n"); };
host1.Open();
}
这样已经强大了,传入服务和协定的Type,就可以实现服务在Http和Tcp上的承载了。当有一天我们需要msmq,当有一天我们想把服务运行情况的记录到数据库中,当...。通常需求是多变的,程序员要多给自己留点后路 |
| 3、后路 |
private static void AddServer(Type type, Type iType, bool useTcpHost, bool useHttpHost)
{
if (useTcpHost)
AddTcpServer(type, iType);
if (useHttpHost)
AddHttpServer(type, iType);
}
//添加支持TCP协议服务
private static void AddTcpServer(Type type, Type iType)
{
ServiceHost host = new ServiceHost(type);
NetTcpBinding nb = new NetTcpBinding(SecurityMode.None);
host.AddServiceEndpoint(iType, nb, string.Concat("net.tcp://", Ip, ":", TcpPort, "/", iType.Name));
OpenServer(host, type.Name + "Tcp服务");
}
//添加支持TCP协议服务
private static void AddHttpServer(Type type, Type iType)
{
ServiceHost host = new ServiceHost(type);
WSHttpBinding nb = new WSHttpBinding(SecurityMode.None);
host.AddServiceEndpoint(iType, nb, string.Concat("http://", Ip, ":", HttpPort, "/", iType.Name));
OpenServer(host, type.Name + "Http服务");
}
private static void OpenServer(ServiceHost host, string name)
{
try
{
host.Opening += delegate { ShowMessage(name + "启动中"); };
host.Opened += delegate { ShowMessage(name + "已经启动"); };
host.Open();
}
catch (Exception ex)
{
ShowMessage(host.ToString() + ex.Message);
}
}
private static void ShowMessage(string outMessage)
{
Console.WriteLine(DateTime.Now.ToString() + " " + outMessage + "\r\n");
}
第一眼相同的功能代码多多了。是不是很麻烦呢?要是你觉得是,那我承认我太失败了,这样之前说的问题就不用担心了,很简单就解决了。当时新的服务总是有,总是要我改代码,重新发布也麻烦啊。下面说不改代码的办法 |
| 4、不改代码的办法 |
static void Main(string[] args)
{
Setup();
Console.ReadLine();
}
private static void Setup()
{
string docPath = path + "\\Assembly.xml";
if (File.Exists(docPath))
{
XDocument xdoc = XDocument.Load(docPath);
foreach (XElement element in xdoc.Root.Element("BLLFiles").Elements())
{
LoadType(element.Attribute("FileName").Value);
}
}
}
private static void LoadType(string bllPath)
{
if (!File.Exists(path + "\\" + bllPath + ".dll"))
return;
Assembly bllAssembly = Assembly.LoadFile(path + "\\" + bllPath + ".dll");
Type[] types = bllAssembly.GetTypes();
foreach (Type type in types)
{
Type t1 = bllAssembly.GetType(bllPath + ".I" + type.Name);
if (type == null || t1 == null)
continue;
AddServer(type, t1, true, true);
}
}
Assembly.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<AssemblyInfos>
<BLLFiles>
<BLLFile FileName="WcfService"/>
</BLLFiles>
</AssemblyInfos>
承认你丫的事情多,我用一个X妹儿没你要加载的Dll文件记录下。 然后反射去你所有的类。然后自动加载所有有协定的类。以后有新的服务在其他dll中,我加行BLLFil,哈哈哈,在此笑过。。。。 |
| 我用这样的方式实现了,一套自己的管理系统,下载 用户名1 密码 111 |
| 本实例源码 |
| 感谢大家拍砖,偶也是摸着石头过河 |
WCF 自承载 提供源码的更多相关文章
- UI层调用WCF服务实例(源码)
WCF原理性的东西,暂时还没有深入研究,只是在公司的项目中使用到了,会调用,然后再多做了一些了解,现在将它抽出来了一个小实例,写了一个WCF的demo. 我写的这个WCF.Demo主要包括数据契约和服 ...
- EasyMvc--让MVC区域开发更Easy(提供源码下载)
核心: 主要利用MVC的区域功能,实现项目模块独立开发和调试. 目标: 各个模块以独立MVC应用程序存在,即模块可独立开发和调试. 动态注册各个模块路由. 一:新建解决方案目录结构 如图: 二:Eas ...
- 重磅来袭,开源Asp.Net MVC网上商城BrnShop正式发布,提供源码下载(转)
BrnShop网上商城是以Asp.Net mvc3为基础开发的网上商城,源代码完全开源(企业版的源代码目前还没有完全整理完成,一旦整理完成也全部开源). 啥话也不说了,直接上源码:下载源码(由于公司服 ...
- 搜索引擎Hoot的源码阅读(提供源码)
开门见山,最近阅读了一下一款开源引擎的源码,受益良多(学到了一些套路).外加好久没有写博客了(沉迷吃鸡,沉迷想念姑娘),特别开一篇.Hoot 的源码地址, 原理介绍地址.外加我看过之后的注释版本,当然 ...
- C# 视频监控系统(提供源码分享)
去过工厂或者仓库的都知道,在工厂或仓库里面,会有很多不同的流水线,大部分的工厂或仓库,都会在不同流水线的不同工位旁边安装一台电脑,一方面便于工位上的师傅把产品的重要信息录入系统,便于公司系统数据采集分 ...
- 简约的ASP.NET 系统框架,提供源码。
好东西,好东西就要分享. 其实谈不上什么好东西,但很实用,应用起来也很简单,我自己用它构建了多套ASP .NET系统,原理也很简单: 1.用XML文件编辑系统的菜单和Toolbar: 2.读取XML节 ...
- 使用APICloud写“华为商城”(前端+后端) 无保留提供源码
第一次分享了一个可以算是完整的手机商城项目,之前从别人的源码中得到了许多帮助,现在入门了也希望能帮一下大家. 注: 前端,后端都有 数据用的是APICloud的MCM,所以小心流量. 目前只有Andr ...
- 玩转控件:重绘DEVEXPRESS中DateEdit控件 —— 让DateEdit支持只选择年月 (提供源码下载)
前言 上一篇博文<玩转控件:重绘ComboBox —— 让ComboBox多列显示>中,根据大家的回馈,ComboBox已经支持筛选了,更新见博文最后最后最后面. 奇葩 这两天遇到 ...
- 微信/易信公共平台开发(二):自定义菜单的PHP实现(提供源码)
微信把公众号分成订阅号和服务号两种,服务号可以自定义菜单, 菜单大大方便了用户操作. 比如:公众服务号 "中国南方航空" 的自定义菜单如下图: 点菜单就可以直接进入操作了,方便! ...
随机推荐
- codeforce 1A Theatre Square
A. Theatre Square Theatre Square in the capital city of Berland has a rectangular shape with the siz ...
- day4正则表达式
语法: 正则表达式是处理字符串的函数,我们在Excel函数中也有很多这样的公式,因为学过一些Excel,所以看一下有什么不同的方法. import re #导入re模块,处理正则表达式的模 ...
- centos7 修改时区
Linux 系统(我特指发行版, 没说内核) 下大部分软件的风格就是不会仔细去考虑向后 的兼容性, 比如你上个版本能用这种程序配置, 没准到了下一个版本, 该程序已经不见了. 比如 sysvinit ...
- c# 递归异步获取本地驱动器下所有文件
//获取所有驱动器 string[] drives = Environment.GetLogicalDrives(); foreach (string driver in drives) { Cons ...
- 【SQL SERVER】触发器(二)
前言:上面一片文章整理了触发器的基础知识点,下面我们看看如何使用触发器以及insert和delete表: 这里我们补充一下触发器的缺点: 性能较低.我们在运行触发器时,系统处理的大部分时间花费在参照其 ...
- 洛谷P2680 运输计划 [LCA,树上差分,二分答案]
题目传送门 运输计划 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n?1 条双向航道,每条航道建立在两个星球之间, 这 n?1 条航道连通了 L 国的所 ...
- 洛谷P4768 [NOI2018]归程 [可持久化并查集,Dijkstra]
题目传送门 归程 格式难调,题面就不放了. 分析: 之前同步赛的时候反正就一脸懵逼,然后场场暴力大战,现在呢,还是不会$Kruskal$重构树,于是就拿可持久化并查集做. 但是之前做可持久化并查集的时 ...
- 分布式锁的理解,java自带的锁为什么会失效
前段时间在发送短信的代码块上通过网上找的工具类基于Redis实现了分布式锁的功能 对应的链接https://www.cnblogs.com/c-h-y/p/9391602.html 周末想细细看一下. ...
- JAVAEE学习——hibernate02:实体规则、对象状态、缓存、事务、批量查询和实现客户列表显示
一.hibernate中的实体规则 实体类创建的注意事项 1.持久化类提供无参数构造 2.成员变量私有,提供共有get/set方法访问.需提供属性 3.持久化类中的属性,应尽量使用包装类型 4.持久化 ...
- 【BZOJ 2194】2194: 快速傅立叶之二(FFT)
2194: 快速傅立叶之二 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1273 Solved: 745 Description 请计算C[k]= ...
