WCF重写ServiceHost,实现独立配置文件

原文地址:http://www.cnblogs.com/Gyoung/p/3651076.html

有时我们需要将WCF的配置文件放在单独的配置文件中,而默认情况下WCF又是在web.config或app.config中去寻找服务配置。如果我们把配置文件放在另一个config文件中,如何让WCF知道呢?

答案就是重写ServiceHost。在重写中告诉WCF配置文件的路径。

   public class MyServiceHost:ServiceHost
    {
        private string ConfigPath =System.AppDomain.CurrentDomain.BaseDirectory+ "MyApp.config";

        public MyServiceHost(Type serviceType, params Uri[] baseAddresses) :
            base(serviceType, baseAddresses)
        {
        }

        protected override void ApplyConfiguration()
        {
            // Check user config invalidation
            if (!CheckConfigExist(ConfigPath))
            {
                // Use default config
                base.ApplyConfiguration();
                return;
            }
            //base.ApplyConfiguration();
            // Use user config
            ExeConfigurationFileMap execfgMap = new ExeConfigurationFileMap();
            // Set user config FilePath
            execfgMap.ExeConfigFilename = ConfigPath;
            // Config info
            Configuration cfg = ConfigurationManager.OpenMappedExeConfiguration(execfgMap,ConfigurationUserLevel.None);
            // Gets all service model config sections
            ServiceModelSectionGroup servicemodelSections = ServiceModelSectionGroup.GetSectionGroup(cfg);  

            // Find serivce section matched with the name "this.Description.ServiceType.FullName"
            if (!ApplySectionInfo(this.Description.ServiceType.FullName,servicemodelSections))
            {
                throw new Exception("ConfigApply Error : There is no endpoint existed in your config!! Please check your config file!");
            }
            this.ApplyMultiBehaviors(servicemodelSections);  

        }

        /// <summary>
        /// Check config file!
        /// </summary>
        /// <param name="configpath"></param>
        /// <returns></returns>
        private bool CheckConfigExist(string configpath)
        {
            if (string.IsNullOrEmpty(configpath)) return false;
            if (!File.Exists(configpath)) return false;
            return true;
        }

        /// <summary>
        /// Apply section info
        /// </summary>
        /// <param name="serviceFullName"></param>
        /// <param name="servicemodelSections"></param>
        /// <returns></returns>
        private bool ApplySectionInfo(string serviceFullName, ServiceModelSectionGroup servicemodelSections)
        {
            // Check config sections (!including one section at least!)
            if (servicemodelSections == null) return false;
            // Service name can‘t be none!
            if (string.IsNullOrEmpty(serviceFullName)) return false;
            bool isElementExist = false;
            foreach (ServiceElement element in servicemodelSections.Services.Services)
            {
                if (element.Name == serviceFullName)
                {
                    // Find successfully & apply section info of config file
                    base.LoadConfigurationSection(element);
                    // Find service element successfully
                    isElementExist = true;
                    break;
                }
            }
            return isElementExist;
        }

        /// <summary>
        /// Add behaviors
        /// </summary>
        /// <param name="servicemodelSections"></param>
        /// <returns></returns>
        private bool ApplyMultiBehaviors(ServiceModelSectionGroup servicemodelSections)
        {
            if (servicemodelSections == null) return false;
            foreach (ServiceBehaviorElement element in servicemodelSections.Behaviors.ServiceBehaviors)
            {
                foreach (BehaviorExtensionElement behavior in element)
                {
                    BehaviorExtensionElement behaviorEx = behavior;
                    object extention = behaviorEx.GetType().InvokeMember("CreateBehavior",
                        BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,
                        null,
                        behaviorEx,
                        null);
                    if (extention == null) continue;
                    IServiceBehavior isb = (IServiceBehavior)extention;
                    //if (base.Description.Behaviors.Contains(isb)) break;
                    bool isbehaviorExisted = false;
                    foreach (IServiceBehavior i in base.Description.Behaviors)
                    {
                        if (i.GetType().Name == isb.GetType().Name)
                        {
                            isbehaviorExisted = true;
                            break;
                        }
                    }
                    if (isbehaviorExisted) break;
                    base.Description.Behaviors.Add((IServiceBehavior)extention);
                }
            }
            return true;
        }

    }

像上面那样,我们就把配置文件移到了MyApp.config。如果是控制台程序类的WCF服务就可以像下面那样来启动:

          using (MyServiceHost host=new MyServiceHost(typeof(Service1)))
            {
                //... do something
                host.Open();
            }

而对于宿主是IIS的WCF服务,我们还需要再重写ServiceHostFactory:

 public class MyServiceHostFactory :  ServiceHostFactory
    {
        protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
        {
            return new MyServiceHost(serviceType, baseAddresses);
        }
    }

然后在WCF服务的svc文件中,指定factory属性的值为我们重写的ServiceHostFactory:

<%@ ServiceHost Factory="WcfService1.MyServiceHostFactory"  Language="C#" Debug="true" Service="WcfService1.Service1" CodeBehind="Service1.svc.cs" %>
时间: 2024-10-12 13:42:15

WCF重写ServiceHost,实现独立配置文件的相关文章

WCF 寄宿方式 代码,配置文件

可以通过代码或者配置文件寄宿WCF服务,在使用过程中的一些心得,记录一下,方便后续查阅. 预备知识,几个地址的作用 1. behavior.HttpGetUrl  定义元数据的地址,如果不定义基地址,则必须定义HttpGetUrl ,是The absolute or relative location of the metadata. 2.baseAddresses 服务的地址,因为元数据(metadata)是属于一个host的,并不属于一个endpoint.此基地址就是客户端添加服务引用的地址

WCF 自托管、无配置文件实现jsonp(跨域)的访问

以下内容基于WCF4.0,本文将对比讨论配置文件方案和无配置文件方案的实现方式. WCF4.0加入了对RESTFU和标准终结点的支持,这为实现跨域提供了简单的方式. 一.有配置文件的情况: 首先我们先定义一个服务: [ServiceContract] public class MinitorServer { [OperationContract] public bool Test() { return true; } } 在这里我故意没有声明接口,顺便废话几句,正常情况下我们应该定义接口去显示服

Nagios各独立配置文件详细介绍

以下介绍各配置文件的详细情况 查看安装正文请点击此处 a. templates.cfg文件 nagios主要用于监控主机资源以及服务,在nagios配置中称为对象,为了不必重复定义一些监控对象,Nagios引入了一个模板配置文件,将一些共性的属性定义成模板,以便于多次引用.这就是templates.cfg的作用. 下面详细介绍下templates.cfg文件中每个参数的含义: define contact{         name                            gene

三、安装配置多实例MYSQL5.6-多独立配置文件方法

1.准备工作 检查操作系统版本.内核版本.selinux是否关闭.防火墙策略.IP地址.主机名配置.host表配置.yum配置 上传cmake.mysql5.6软件包 具体步骤参考源码安装mysql-单实例配置文档 2.安装cmake软件 2.1 安装编译软件环境 [[email protected] ~]# yum -y install gcc-c++ncurses-devel make perl bison ncurses 2.2 解压软件包 [[email protected] ~]# c

最新学习网址大全

log4j详细配置http://blog.csdn.net/andyfor/article/details/4437697LOG4NET用法(个人比较喜欢的用法)http://fanrsh.cnblogs.com/archive/2006/06/08/420546.htmlhttp://www.360doc.com/content/14/0924/12/1355383_411979610.shtmllog4net按照不同的[LEVEL]级别输出到不同文件http://blog.csdn.net/

自定义WCF的配置文件

原文地址:http://www.cnblogs.com/shanyou/archive/2008/12/02/1346298.html WCF的承载既可以通过编码实现,也能够通过配置实现.而且使用配置,更有利于日后的维护和扩展.我们经常会碰到这样的一个场景:需要把WCF的配置信息放在一个单独的文件中,这种情况经常出现在需要为自己开发的服务配置,需要采用独立的配置文件,而不是只能放到app.config/web.config中..NET提供了一种机制是通过ConfigSource.例如在asp.n

WCF通过SVCUtil.exe生成客户端代理类和配置文件(转)

WCF服务调用通过两种常用的方式: 1:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式. 2:一种是通过ChannelFactory直接创建服务代理对象进行服务调用. 本文只针对通过SvcUtil.exe工具生成代理类和对应配置文件来讲 一:通过cmd命令行生成代理类和对应配置文件 1.找到如下地址“C:\Windows\System32\cmd.exe”  命令行工具,右键以管理员身份运行(视系统是否为win7 而定) 2.输入如下命令: C:\>cd C:\Program

WCF开山篇__图片传输

WCF开山篇__图片传输 一.  简介 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序接口,可以翻译为Windows通讯接口,它是.NET框架的一部分,由 .NET Framework 3.0 开始引入,与 Windows Presentation Foundation及 Windows Workflow Foundation并行为新一代 Windows 操作系统以及 WinFX 的三个重大应用程序开发类库.WCF由于集合了几乎由.

WCF服务端开发和客户端引用小结

1.服务端开发(包含寄宿) 1.1 WCF服务创建方式 创建一个WCF服务,总是会创建一个服务接口和一个服务接口实现.通常根据服务宿主的不同,有两种创建方式. (1)创建WCF应用程序 通过创建WCF服务应用程序,可生成一个带.svc后缀名的文件.该文件与webform中的aspx文件类似,有后置代码,这些后置代码是服务接口的实现.这种方式创建的WCF服务都承载在IIS或WAS上. (2)创建WCF服务库 WCF服务库是一个类库,如前所述包含一个服务接口和服务实现,此种方式创建的WCF服务可根据