如果有很多WCF服务需要寄宿,需要额外做一些工作:
总体思路是:先把这些WCF服务的程序集打包,然后利用反射加载各个WCF服务的程序集,按顺序一个一个寄宿。
先来看看我们需要寄宿的WCF服务:

实现步骤:
1、配置文件中打包这些WCF程序集信息。

2、需要自定义配置节点以及实现读取自定义配置节点的方法。
在configSections节点增加配置:

 <section name="ValidServices"
type="Mdtit.XXX.Mall.Hosting.ValidServicesSection, Mdtit.XXX.Mall.Hosting" />

配置处理类实现如下:

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Configuration;
using System.ServiceModel.Configuration;
using System.ServiceModel;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.ServiceModel.Description;
using System.Text;
using Mdtit.XXX.Mall.Common; namespace Mdtit.XXX.Mall.Hosting
{
/// <summary>
/// Custom configuration section for valid service setting
/// </summary>
internal class ValidServicesSection : ConfigurationSection
{
[ConfigurationProperty("Services")]
public ValidServiceCollection ValidServices
{
get { return this["Services"] as ValidServiceCollection; }
}
} /// <summary>
/// Custom configuration element collection for valid service setting
/// </summary>
internal class ValidServiceCollection : ConfigurationElementCollection
{
protected override ConfigurationElement CreateNewElement()
{
return new ValidService();
} protected override object GetElementKey(ConfigurationElement element)
{
return ((ValidService)element).Type;
}
} /// <summary>
/// Custom configuration element for valid service setting
/// </summary>
internal class ValidService : ConfigurationElement
{
[ConfigurationProperty("Type")]
public string Type
{
get
{
return (string)this["Type"];
}
}
}
}

3、windows服务的Main函数

static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
static void Main()
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new XXXService()
};
ServiceBase.Run(ServicesToRun);
}
}

4、windows服务类:XXXService

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using Mdtit.XXX.Mall.Hosting;
using Mdtit.XXX.Mall.Common;
using System.ServiceModel; namespace Mdtit.XXX.Mall.Hosting.Service
{
public partial class XXXService : ServiceBase
{
/// <summary>
/// All avalilable services.
/// </summary>
static List<ServiceHost> _allHosts = new List<ServiceHost>(); public XXXService()
{
InitializeComponent();
} protected override void OnStart(string[] args)
{
try
{
ServiceManager.StartAllValidServices();
LogHelper.LogInformation("All WCF services started.");
}
catch (ApplicationException ex)
{
LogHelper.LogInformation(ex.Message);
}
} protected override void OnStop()
{
try
{
ServiceManager.CloseAllServices();
LogHelper.LogInformation("All WCF services stopped.");
}
catch (ApplicationException ex)
{
LogHelper.LogInformation(ex.Message);
}
}
}
}

其中,ServiceManager.StartAllValidServices() 和 ServiceManager.CloseAllServices()是用来批量处理WCF服务的。

5、ServiceManager类实现如下:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Reflection;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Text; using Mdtit.XXX.Mall.Common; namespace Mdtit.XXX.Mall.Hosting
{
/// <summary>
/// Helper class to start/stop services
/// </summary>
internal class ServiceManager
{
/// <summary>
/// Container for all valid services
/// </summary>
static List<ServiceHost> _AllHosts = new List<ServiceHost>(); /// <summary>
/// Start all valid services.
/// </summary>
public static void StartAllValidServices()
{
string entryLocation = Assembly.GetEntryAssembly().Location; Configuration conf = ConfigurationManager.OpenExeConfiguration(entryLocation); ValidServicesSection validServiceSettings
= ConfigurationManager.GetSection("ValidServices") as ValidServicesSection; if (validServiceSettings != null)
{
foreach (ValidService validService in validServiceSettings.ValidServices)
{
string typeToLoad = validService.Type; // Load the assembly dynamic
string assemblyName = typeToLoad.Substring(typeToLoad.IndexOf(',') + 1);
Assembly.Load(assemblyName); Type svcType = Type.GetType(typeToLoad);
if (svcType == null)
{
string errInfo = string.Format("Invalid Service Type \"{0}\" in configuration file.",
typeToLoad); LogHelper.LogError(errInfo);
throw new ApplicationException(errInfo);
}
else
{
OpenHost(svcType);
}
}
}
else
{
throw new ApplicationException("Application configuration for WCF services not found!");
}
} /// <summary>
/// Create a host for a specified wcf service;
/// </summary>
/// <param name="t"></param>
private static void OpenHost(Type t)
{
ServiceHost host = new ServiceHost(t); host.Opened += new EventHandler(hostOpened);
host.Closed += new EventHandler(hostClosed);
host.Open(); _AllHosts.Add(host);
} /// <summary>
/// Close all services
/// </summary>
public static void CloseAllServices()
{
foreach (ServiceHost host in _AllHosts)
{
if (host.State != CommunicationState.Closed)
{
host.Close();
}
}
} /// <summary>
/// Event handler for host opened
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void hostOpened(object sender, EventArgs e)
{
ServiceDescription svcDesc = ((ServiceHost)sender).Description; string svcName = svcDesc.Name;
StringBuilder allUri = new StringBuilder();
foreach (ServiceEndpoint endPoint in svcDesc.Endpoints)
{
allUri.Append(endPoint.ListenUri.ToString());
} LogHelper.LogInformation(string.Format("Service \"{0}\" started with url: {1}",
svcName, allUri.ToString()));
} /// <summary>
/// Event handler for host closed
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void hostClosed(object sender, EventArgs e)
{
ServiceDescription svcDesc = ((ServiceHost)sender).Description; string svcName = svcDesc.Name; LogHelper.LogInformation(string.Format("Service \"{0}\" stopped.", svcName));
}
}
}

6、开始寄宿
以管理员身份运行我们前面写好的windows服务程序:

结果:

WCF寄宿windows服务二的更多相关文章

  1. WCF寄宿windows服务一

    如果只是寄宿单个wcf服务,方法很简单,步骤:1.创建好一个windows服务.关于windows服务内容见:http://www.cnblogs.com/zhaow/p/7866916.html2. ...

  2. WCF 寄宿Windows以及控制台启动

    一:添加windows服务 二:修改XXXInstaller1的StartType=Automatic,修改ProcessInstaller1的Account=LocalSystem 三:在progr ...

  3. 微软 WCF的几种寄宿方式,寄宿IIS、寄宿winform、寄宿控制台、寄宿Windows服务

    WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者方便.高效提供服务调用.本文分别对这几种方式进行详 ...

  4. WCF服务自我寄宿 Windows服务

    WCF寄宿有自我寄宿跟IIS寄宿 服务代码: [ServiceContract] ---服务契约 public interface ICustomerService { [OperationContr ...

  5. Windows服务二:测试新建的服务、调试Windows服务

    一.测试Windows服务 为了使Windows服务程序能够正常运行,我们需要像创建一般应用程序那样为它创建一个程序的入口点.像其他应用程序一样,Windows服务也是在Program.cs的Main ...

  6. WCF安装Windows服务

    安装图解: 安装命令: 1. 开始 ->运行 ->cmd2. cd到C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319(Framework版本号按I ...

  7. C#创建windows服务(二:创建和卸载windows服务)

    引用地址: https://docs.microsoft.com/zh-cn/dotnet/framework/windows-services/how-to-create-windows-servi ...

  8. WCF服务寄宿Windows

    windows服务的介绍 Windows服务应用程序是一种需要长期运行的应用程序,它对于服务器环境特别适合.它没有用户界面,并且也不会产生任何可视输出.任何用户消息都会被写进Windows事件日志.计 ...

  9. C#.NET 操作Windows服务承载WCF

    Windows服务的制作.安装可以参考这篇: C#.NET 操作Windows服务(安装.卸载) - runliuv - 博客园 (cnblogs.com) 本篇会在这个解决方案基础上,继续修改. 一 ...

随机推荐

  1. @Transactional(事务讲解)和springboot 整合事务

    概述 事务在编程中分为两种:声明式事务处理和编程式事务处理 编程式事务处理:编码方式实现事务管理,常与模版类TransactionTemplate(推荐使用) 在业务代码中实现事务. 可知编程式事务每 ...

  2. JavaScript如何封装插件

    什么是封装呢? 我的理解就是 把一个功能单独做成一个组件,就像做饺子,以前做饺子必须自己先用面粉做饺子皮,再做饺子馅,然后再手工包饺子,但是现在人们发明了自动包饺子机器,虽然机器里面的每一步骤和你自己 ...

  3. Android 中更新 UI 的四种方式

    runOnUiThread handler 的 post handler 的 sendMessage View 自身的 post

  4. Eclipse中给SVN添加项目

    SVN添加项目, 1.在svn资源库中的目标路径上右键,新建一个远程文件夹,文件夹名称和项目名称一致即可. 2,在新建的远程目录上右键,选导入,导入我们要放到svn的本地项目. 3.导入时选中项目的名 ...

  5. 分布式存储ceph--osd故障硬盘更换(6)

    正常状态:

  6. openstack核心组件--neutron网络服务(4)

    一.neutron 介绍:   Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备:而云环境下的网络已经变得非常复杂,特别是在多租户场景里,用户随时都可能需要 ...

  7. MATLAB学习(四)线性方程求解,多项式运算,函数局部最优解

    >> A=[2 1 3;1 3 2];B=[5;10] B = 5 10 >> X=lsqnonneg(A,B) X = 0 2.8571 0.7143 >> A\ ...

  8. Spring Boot 2.0 集成 Druid 数据源

    一.Maven项目依赖 <!-- 开发者工具(热部署 修改classpath下的文件springboot自动重启) --> <dependency> <groupId&g ...

  9. Windows命令行工具cmder配置

    简介 cmder是一个增强型命令行工具,不仅可以使用windows下的所有命令,更爽的是可以使用linux的命令,shell命令. 下载 官网地址:http://cmder.net/ 下载的时候,会有 ...

  10. HBASE概念补充

    HBASE概念补充 HBase的工作方式: hbase中的表在行的方向上分隔为多个HRegion,分散在不同的RegionServer中 这样做的目的是在查询时可以将工作量分布到多个RegionSer ...