对于WCF的宿主启动来说,有好多方法,单独启动也很简单,可以根据业务需要来自由选择(单独启动方法这里就不做解释)

对于业务服务比较多的时候,往往需要多个服务来承载系统,但是如果将服务启动单独写代码启动的话,这样就造成代码的耦合,增加服务,删除服务都需要对宿主程序进行修改编译,因而就需要一个批量启动的办法

现在着重整理一下理由反射批量启动

思路:1、自定义两个属性,用于接口和实现类,一个为接口属性,一个为实现类属性

   2、利用反射获取指定程序集的所有类文件,根据标记属性可以获取到那些为WCF接口和那些为WCF实现类

   3、可以通过反射获取到实现类继承与什么接口

   4、根据前三项即可将指定程序集的接口类和实现类对应

具体代码如下:

属性:

 namespace ESTM.WCF.Service
{
//标记此特性的为WCF服务接口
public class ServiceInterfaceAttribute : Attribute
{
} //标记此特性的为WCF服务接口实现类
public class ServiceClassAttribute : Attribute
{
}
}

接口和实现

 namespace ESTM.WCF.Service
{
/// <summary>
/// 工厂布局模块接口契约
/// </summary>
[ServiceInterface]
[ServiceContract]
public interface IFactoryLayoutWCFService
{
[OperationContract]
List<DTO_TM_PLANT> GetAllPlant();
}
}
 namespace ESTM.WCF.Service
{
[ServiceClass]
public class FactoryLayoutWCFService : IFactoryLayoutWCFService
{
public List<DTO_TM_PLANT> GetAllPlant()
{
throw new NotImplementedException();
}
}
}

WCF 批量启动帮助类

 namespace ESTM.WCF.Service
{
public class Bootstrapper
{
private string strBaseServiceUrl = ConfigurationManager.AppSettings["ServiceUrl"].ToString(); //启动所有的服务
public void StartServices()
{
//1.读取此程序集里面的有服务契约的接口和实现类
var assembly = Assembly.Load(typeof(Bootstrapper).Namespace);
//获取当前程序集的所有类文件(包括接口和类)
var lstType = assembly.GetTypes();
//存储当前程序集的所有接口
var lstTypeInterface = new List<Type>();
//存储当前程序集的所有接口实现类
var lstTypeClass = new List<Type>(); foreach (var oType in lstType)
{
//2.通过接口上的特性取到需要的接口和实现类
var lstCustomAttr = oType.CustomAttributes;
//如果当前类上面存在属性标签
if (lstCustomAttr.Count() <= )
{
continue;
}
//获取第一个属性标签,并且判断是否相等于接口自定义属性
//如果相等,则为接口
var oInterfaceServiceAttribute = lstCustomAttr.FirstOrDefault(x => x.AttributeType.Equals(typeof(ServiceInterfaceAttribute)));
if (oInterfaceServiceAttribute != null)
{
lstTypeInterface.Add(oType);
continue;
}
//如果相等,则为类
var oClassServiceAttribute = lstCustomAttr.FirstOrDefault(x => x.AttributeType.Equals(typeof(ServiceClassAttribute)));
if (oClassServiceAttribute != null)
{
lstTypeClass.Add(oType);
}
} //3.启动所有服务
foreach (var oInterfaceType in lstTypeInterface)
{
//在实现类集合中 获取由当前 Type 实现或继承的特定接口。
var lstTypeClassTmp = lstTypeClass.Where(x => x.GetInterface(oInterfaceType.Name) != null).ToList();
if (lstTypeClassTmp.Count <= )
{
continue;
}
//如果当前类获取到的接口等于遍历的接口名称,则匹配成功,
if(lstTypeClassTmp[].GetInterface(oInterfaceType.Name).Equals(oInterfaceType))
{
var oTask = Task.Factory.StartNew(() =>
{
OpenService(strBaseServiceUrl + "/" + oInterfaceType.Name, oInterfaceType, lstTypeClassTmp[]);
});
}
}
} //通过服务接口类型和实现类型启动WCF服务
private void OpenService(string strServiceUrl, Type typeInterface, Type typeclass)
{
Uri httpAddress = new Uri(strServiceUrl);
using (ServiceHost host = new ServiceHost(typeclass))//需要添加System.SystemModel这个dll。。。。CSOAService这个为实现ICSOAService的实现类,WCF真正的实现方法再这个类里面
{
///////////////////////////////////////添加服务节点///////////////////////////////////////////////////
host.AddServiceEndpoint(typeInterface, new WSHttpBinding(), httpAddress);//ICSOAService这个为向外暴露的接口
if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
{
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
behavior.HttpGetEnabled = true;
behavior.HttpGetUrl = httpAddress;
host.Description.Behaviors.Add(behavior);
}
host.Opened += delegate
{
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("服务启动成功。服务地址:" + strServiceUrl);
}; host.Open();
while (true)
{
Console.ReadLine();
}
}
}
}
}

利用反射,批量启动WCF服务的更多相关文章

  1. 普通用户如何启动WCF服务

    做Winform项目时,部署到客户机上有两个应用程序,Host和Client,在Host上运行着WCF服务供Client调用.平时现在在测试的时候都没发现有问题,但是当安装到客户的正式环境时发现服务启 ...

  2. WCF全面解析之三 使用配置文件启动WCF服务

    知识:WCF地址.WCF绑定 Endpoint的配置 服务的三要素(ABC) A:Address 地址 有传输方式信息 B:Binding 怎么做(与地址的传输方式要匹配) C:Contract 做什 ...

  3. 启动WCF多个服务方法

    引用就不说明,直接贴上: using System;using System.Collections.Generic;using System.Linq;using System.Text;using ...

  4. 编写寄宿于windows服务的WCF服务

    由于业务中有些任务需要在后台静默长期运行,或者有些服务队响应的要求比较苛刻,这样的WCF服务就不适合寄宿于IIS中.IIS每隔一段时间w3wp进程会闲置超时,造成服务的运行停止,因此这种耗时或者定时任 ...

  5. WCF服务使用(IIS+Http)和(Winform宿主+Tcp)两种方式进行发布

    1.写在前面 刚接触WCF不久,有很多地方知其然不知其所以然.当我在[创建服务->发布服务->使用服务]这一过程出现过许多问题.如客户端找不到服务引用:客户端只在本机环境中才能访问服务,移 ...

  6. WCF服务端调用client.

    wcf服务端 1,新建一个"windows窗口程序"名称为WCFServer2. 2.然后加入一个"WCF服务"名称为Service1. 详细步骤为:解决方式试 ...

  7. 记录:Web无引用无配置方式动态调用WCF服务

    这几年一直用WebApi较多,最近项目中有个需求比较适合使用WCF,以前也用过JQuery直接调用Wcf的,但是说实话真的忘了… 所以这次解决完还是花几分钟记录一下 WCF服务端:宿主在现有Win服务 ...

  8. WCF学习之旅—WCF服务的批量寄宿(十三)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) WCF学习之旅—WCF ...

  9. 三十、【C#.Net开发框架】WCFHosting服务主机的利用WCF服务通讯和实现思路

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

随机推荐

  1. ASP.NET Core 2 学习笔记(二)生命周期

    要了解程序的运行原理,就要先知道程序的进入点及生命周期.以往ASP.NET MVC的启动方式,是继承 HttpApplication 作为网站开始的进入点,而ASP.NET Core 改变了网站的启动 ...

  2. Webapi上传数据(XML)敏感字符解决方案

    方法名加特性 [ValidateInput(false)] 配置文件加 <httpRuntime requestValidationMode="2.0" targetFram ...

  3. Backtracking-401. Binary Watch

    A binary watch has 4 LEDs on the top which represent the hours (0-11), and the 6 LEDs on the bottom ...

  4. 【小程序云开发入门】quickStart

    开发者可以使用云开发开发微信小程序.小游戏,无需搭建服务器,即可使用云端能力. 云开发为开发者提供完整的云端支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现 ...

  5. Optimizing Your App for Today’s Internet

    这个 session 的主讲人感觉是一个很典型的美国人,年纪也不小. 网络现状 四十亿人在使用因特网,大概占有世界人口的一半.上网人数的增长在减缓. 但是网络仍然在增长.增长点主要在物联网.第三世界国 ...

  6. 4. Neural Network

    1. 神经网络 首先引入一些便于稍后讨论的新标记: $L$:代表神经网络层数$S_l$:代表第$l$层处理单元的个数$K$:代表多分类中类别种数 2. 前向传播(forward propagation ...

  7. 可方便扩展的JIRA Rest Web API的封装调用

    JIRA是一个缺陷跟踪管理系统,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域,当我们需要把第三方业务系统集成进来时,可以调用他的API. JIRA本身的A ...

  8. php引用使用不恰当而产生问题的地方

    php变量的引用,如果使用的恰当,会带来效率的提升,相反,效率下降 $array = range(, ); $ref =& $array; var_dump(count($array)); / ...

  9. Label Propagation Algorithm LPA 标签传播算法解析及matlab代码实现

    转载请注明出处:http://www.cnblogs.com/bethansy/p/6953625.html LPA算法的思路: 首先每个节点有一个自己特有的标签,节点会选择自己邻居中出现次数最多的标 ...

  10. Kubernetes使用GlusterFS实现数据持久化

    k8s中部署有状态应用等需要持久化数据的应用,必不可少得用存储,k8s支持很多中存储方案,我司目前使用的存储有glusterfs(分为容器化和裸机方式).nfs供应用选用,本次就简单实战下gluste ...