一、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 自承载 提供源码的更多相关文章

  1. UI层调用WCF服务实例(源码)

    WCF原理性的东西,暂时还没有深入研究,只是在公司的项目中使用到了,会调用,然后再多做了一些了解,现在将它抽出来了一个小实例,写了一个WCF的demo. 我写的这个WCF.Demo主要包括数据契约和服 ...

  2. EasyMvc--让MVC区域开发更Easy(提供源码下载)

    核心: 主要利用MVC的区域功能,实现项目模块独立开发和调试. 目标: 各个模块以独立MVC应用程序存在,即模块可独立开发和调试. 动态注册各个模块路由. 一:新建解决方案目录结构 如图: 二:Eas ...

  3. 重磅来袭,开源Asp.Net MVC网上商城BrnShop正式发布,提供源码下载(转)

    BrnShop网上商城是以Asp.Net mvc3为基础开发的网上商城,源代码完全开源(企业版的源代码目前还没有完全整理完成,一旦整理完成也全部开源). 啥话也不说了,直接上源码:下载源码(由于公司服 ...

  4. 搜索引擎Hoot的源码阅读(提供源码)

    开门见山,最近阅读了一下一款开源引擎的源码,受益良多(学到了一些套路).外加好久没有写博客了(沉迷吃鸡,沉迷想念姑娘),特别开一篇.Hoot 的源码地址, 原理介绍地址.外加我看过之后的注释版本,当然 ...

  5. C# 视频监控系统(提供源码分享)

    去过工厂或者仓库的都知道,在工厂或仓库里面,会有很多不同的流水线,大部分的工厂或仓库,都会在不同流水线的不同工位旁边安装一台电脑,一方面便于工位上的师傅把产品的重要信息录入系统,便于公司系统数据采集分 ...

  6. 简约的ASP.NET 系统框架,提供源码。

    好东西,好东西就要分享. 其实谈不上什么好东西,但很实用,应用起来也很简单,我自己用它构建了多套ASP .NET系统,原理也很简单: 1.用XML文件编辑系统的菜单和Toolbar: 2.读取XML节 ...

  7. 使用APICloud写“华为商城”(前端+后端) 无保留提供源码

    第一次分享了一个可以算是完整的手机商城项目,之前从别人的源码中得到了许多帮助,现在入门了也希望能帮一下大家. 注: 前端,后端都有 数据用的是APICloud的MCM,所以小心流量. 目前只有Andr ...

  8. 玩转控件:重绘DEVEXPRESS中DateEdit控件 —— 让DateEdit支持只选择年月 (提供源码下载)

      前言 上一篇博文<玩转控件:重绘ComboBox —— 让ComboBox多列显示>中,根据大家的回馈,ComboBox已经支持筛选了,更新见博文最后最后最后面.   奇葩 这两天遇到 ...

  9. 微信/易信公共平台开发(二):自定义菜单的PHP实现(提供源码)

    微信把公众号分成订阅号和服务号两种,服务号可以自定义菜单, 菜单大大方便了用户操作. 比如:公众服务号 "中国南方航空" 的自定义菜单如下图: 点菜单就可以直接进入操作了,方便! ...

随机推荐

  1. chrome浏览器插件开发经验(一)

    最近在进行chrome浏览器插件的开发,一些小的经验总结随笔. 1.首先,推荐360的chrome插件开发文档:http://open.chrome.360.cn/extension_dev/over ...

  2. Java Language Keywords

    Java Language Keywords 典型题目 true.false.null.sizeof.goto.synchronized 哪些是Java关键字?(goto.synchronized) ...

  3. 洛谷P1099 BZOJ1999 树网的核 [搜索,树的直径]

    洛谷传送门,BZOJ传送门 树网的核 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenetwork),其中V ...

  4. 初识GeneXus产品

    本人由于工作原因接触了GeneXus产品,从使用到现在也有些年头了.从刚开始的不熟悉到现在使用GeneXus开发了很多项目,慢慢也总结了一些经验,当然中间也走了很多的弯路.对于在国内同样使用GeneX ...

  5. python 三级菜单 的另1种实现方法

    menu = { "华南":{ "广东":["广州市","佛山市","深圳市","东莞市& ...

  6. Hibernate 悲观锁(Pessimistic Locking)

    在日常开发中并发应该是比较常遇到的业务场景,Hibernate给我们提供了并发操作,接下来简单介绍一下Hibernate悲观控制. 悲观锁:用户其实并不需要花很多精力去担心锁定策略的问题,通常情况下, ...

  7. 【BZOJ 1221】 1221: [HNOI2001] 软件开发 (最小费用流)

    1221: [HNOI2001] 软件开发 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1581  Solved: 891 Description ...

  8. 51nod1981 如何愉快地与STL玩耍

    先摆官方题解吧......... ....................有什么好讲的呢....... 注意一些地方常数优化一下.......然后......$bitset$怎么暴力怎么来吧..... ...

  9. 74.Interesting Sequence(有趣的数列)(拓扑排序)

    Interesting Sequence(有趣的数列)[Special judge] 题目概述:是否存在一个长度为n的整数数列,其任意连续p项之和为正数而任意连续q项之和为负数? 方法:连续项a[i] ...

  10. 某DP题目3

    题意: 一根数轴上有n只怪物,第i个怪物所在的位置为ai,另有m个特殊点,第i个特殊点所在的位置为bi.你可以对怪物进行移动,若两怪物相邻,那么你不能把他们分开,移动时要看作一个整体.你可以选择向左或 ...