自定义WCF的配置文件

原文地址:http://www.cnblogs.com/shanyou/archive/2008/12/02/1346298.html

WCF的承载既可以通过编码实现,也能够通过配置实现.而且使用配置,更有利于日后的维护和扩展。我们经常会碰到这样的一个场景:需要把WCF的配置信息放在一个单独的文件中,这种情况经常出现在需要为自己开发的服务配置,需要采用独立的配置文件,而不是只能放到app.config/web.config中。.NET提供了一种机制是通过ConfigSource。例如在asp.net的在站点的默认 Web.Config 文件中使用:

<appSettings configSource="customAppSetting.config"/>

然后新建 customAppSetting.Config 文件:

<?xml version="1.0" encoding="utf-8"?>
<appSettings>
<add key="IsDev" value="True"/>
</appSettings>
在网站运行时,如果修改 Web.Config 文件会引起站点的重启,而修改 My.Config 文件则不会,同时也提高了配置文件的可读性。
然而WCF的配置上configSource是无效的,那么WCF如何自定义配置文件?
WCF的ServiceHost和ChannelFactory<T>分别提供了服务端和客户端的可扩展解决方案。下面针对这两个对象分别说明如何自定义服务端和客户端的配置文件。
1、服务端自定义配置文件:在ServiceHost的父类ServiceHostBase中,有一个和配置文件的加载密切相关的方法,它为:
protected virtual void ApplyConfiguration();
这个方法用于将应用程序配置文件中<system.serviceModel>节点下的配置信息,转换成WCF的具体服务设置。那么重写这个方法,代码如下:

/// <summary>
/// override ApplyConfiguration to load config from custom file
/// </summary>
protected override void ApplyConfiguration()
{
//get custom config file name by our rule: config file name = ServiceType.Name
var myConfigFileName = this.Description.ServiceType.FullName;
//get config file path
string dir = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
string myConfigFilePath = System.IO.Path.Combine(dir, myConfigFileName + ".config");
if (!System.IO.File.Exists(myConfigFilePath))
{
base.ApplyConfiguration();
return;
}
var configFileMap = new System.Configuration.ExeConfigurationFileMap();
configFileMap.ExeConfigFilename = myConfigFilePath;
var config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);
var serviceModel = System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup(config);
if (serviceModel == null)
{
base.ApplyConfiguration();
return;
}
foreach (ServiceElement serviceElement in serviceModel.Services.Services)
{
if (serviceElement.Name == this.Description.ServiceType.FullName)
{
LoadConfigurationSection(serviceElement);
return;
}
}
throw new Exception("there is no service element match the description!");
}
}
}

2、WCF的客户端自定义配置文件,WCF可以通过两种方式构建代理,ClientBase<T>和ChannelFactory<T>,ClientBase最终也是通过ChannelFactory<T>来构建Channel的
ChannelFactory<T>有两个方法为自定义配置文件提供解决方案:

protected virtual void ApplyConfiguration(string configurationName);
protected abstract ServiceEndpoint CreateDescription();

ApplyConfiguration方法和ServiceHost的ApplyConfiguration方法的功能类似,但是有一点不同的是需要和CreateDescription交互。其实ApplyConfiguration并不是客户端代理这里所要关注的地方,我们只需要关注CreateDescription就可以了。

ChannelFactory<T>的方法CreateDescription实现上是从默认配置文件(缺省AppDomain的配置文件),所以我们通过重写这个方法就可以实现从外部文件加载配置。

/// <summary>

/// Loads the serviceEndpoint description from the specified configuration file

/// </summary>

/// <returns></returns>

protected override ServiceEndpoint CreateDescription()

{

ServiceEndpoint serviceEndpoint = base.CreateDescription();

ExeConfigurationFileMap map = new ExeConfigurationFileMap();

map.ExeConfigFilename = this.configurationPath;

Configuration config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);

ServiceModelSectionGroup group = ServiceModelSectionGroup.GetSectionGroup(config);

ChannelEndpointElement selectedEndpoint = null;

foreach (ChannelEndpointElement endpoint in group.Client.Endpoints)

{

if (endpoint.Contract == serviceEndpoint.Contract.ConfigurationName)

{

selectedEndpoint = endpoint;

break;

}

}

if (selectedEndpoint != null)

{

if (serviceEndpoint.Binding == null)

{

serviceEndpoint.Binding = CreateBinding(selectedEndpoint.Binding, group);

}

if (serviceEndpoint.Address == null)

{

serviceEndpoint.Address = new EndpointAddress(selectedEndpoint.Address, GetIdentity(selectedEndpoint.Identity), selectedEndpoint.Headers.Headers);

}

if (serviceEndpoint.Behaviors.Count == 0 && selectedEndpoint.BehaviorConfiguration != null)

{

AddBehaviors(selectedEndpoint.BehaviorConfiguration, serviceEndpoint, group);

}

serviceEndpoint.Name = selectedEndpoint.Contract;

}

return serviceEndpoint;

}

具体的实现可以参看例子代码,这个例子WCF sdk的例子ICalculator。代码下载CustomChannel.zip

时间: 2024-11-13 10:28:17

自定义WCF的配置文件的相关文章

WCF中配置文件解析

WCF中配置文件解析 2014-06-14 参考 WCF中配置文件解析 返回 在WCF Service Configuration Editor的使用中,我们通过配置工具自动生成了WCF服务端的config文件.现在我们来看下这个配置文件各个标签的意义: 1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <!-- 这个程序集我们在项目中有引用的 --> 4

WCF入门二[WCF的配置文件]

一.概述 往往在很多项目中数据库连接字符串.变量和一些动态的加载类会写在配置文件中.WCF也会在配置文件中写入一些配置参数,比如服务的地址.服务用于发送和接收消息的传输和消息编码等,通过配置文件可以灵活的修改,不需要再编译. 二.终结点Endpoint 首先我们需要了解WCF的一个概念就是终结点Endpoint,WCF服务通过定义一个或者多个终结点,当服务端和客户端的终结点相互匹配的时候才可以完成通信.终结点Endpoint由三部分组成Address.Binding和Contract. Addr

【转】WCF入门教程四[WCF的配置文件]

一.概述 配置也是WCF编程中的主要组成部分.在以往的.net应用程序中,我们会把DBConn和一些动态加载类及变量写在配置文件里.但WCF有所不同.他指定向客户端公开的服务,包括服务的地址.服务用于发送和接收消息的传输和消息编码,以及服务需要的安全类型等.使用配置文件后,我们无需编译即可修改WCF的变化的信息,提高了程序的灵活性. 如果在代码里写了配置,那么配置文件将不起作用. Web程序在Web.config中配置,应用程序中在App.config中配置. 二.服务配置的主要部分 在Conf

四、WCF的配置文件

注:本文为学习摘抄,原文地址:http://www.cnblogs.com/iamlilinfeng/archive/2012/10/02/2710224.html 一.概述 配置也是WCF编程中的主要组成部分.在以往的.net应用程序中,我们会把DBConn和一些动态加载类及变量写在配置文件里.但WCF有所不同.他指定向客户端公开的服务,包括服务的地址.服务用于发送和接收消息的传输和消息编码,以及服务需要的安全类型等.使用配置文件后,我们无需编译即可修改WCF的变化的信息,提高了程序的灵活性.

WCF系列之WCF的配置文件

一.概述 配置也是WCF编程中的主要组成部分.在以往的.net应用程序中,我们会把DBConn和一些动态加载类及变量写在配置文件里.但WCF有所不同.他指定向客户端公开的服务,包括服务的地址.服务用于发送和接收消息的传输和消息编码,以及服务需要的安全类型等.使用配置文件后,我们无需编译即可修改WCF的变化的信息,提高了程序的灵活性. 如果在代码里写了配置,那么配置文件将不起作用. Web程序在Web.config中配置,应用程序中在App.config中配置. 二.服务配置的主要部分 在Conf

无废话WCF入门教程四[WCF的配置文件]

一.概述 配置也是WCF编程中的主要组成部分.在以往的.net应用程序中,我们会把DBConn和一些动态加载类及变量写在配置文件里.但WCF有所不同.他指定向客户端公开的服务,包括服务的地址.服务用于发送和接收消息的传输和消息编码,以及服务需要的安全类型等.使用配置文件后,我们无需编译即可修改WCF的变化的信息,提高了程序的灵活性. 如果在代码里写了配置,那么配置文件将不起作用. Web程序在Web.config中配置,应用程序中在App.config中配置. 二.服务配置的主要部分 在Conf

C#中读写自定义的web 配置文件

开发程序的过程中,有时候我们需要自己编写一个config文件,比如取名App.config, 然后写一些配置信息在里面.然后我们需要编写C#代码来对这个配置文件进行读写 比如:App.Config <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="mySection" type=&

gradle 自定义插件 下载配置文件

1.新建Gradle项目: 2.建立src/main/groovy目录,并添加如下代码: ConfigPlugin.groovy package com.wemall.config import org.gradle.api.Plugin import org.gradle.api.Project class ConfigPlugin implements Plugin<Project> { void apply(Project project) { project.extensions.cr

自定义工具类---配置文件读取方法集成类

此类集成了一部分用于读取properties文件的数据的方法,如日期,字符串,实数型,浮点型,可自行扩展 ConfigUtil.java 1 package cn.jamsbwo.util; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.IOException; 6 import java.text.ParseException; 7 import java.text.SimpleDateF