当前位置:  开发笔记 > 编程语言 > 正文

WCF配置 - 将其从app.config中分离出来

如何解决《WCF配置-将其从app.config中分离出来》经验,为你挑选了3个好方法。

我有一个特定的要求,即从主app.config文件中删除所有客户端WCF配置(),并将其删除到单独的XML文件中.我希望看到的行为类似于使用File =""指令在appSettings部分中提供的行为.事实上,我希望能够为每个消费的服务指定一个单独的文件...

我知道我可以构建一个自定义的ChannelBuilder工厂,它从XML文件(或其中一系列文件)中读取配置数据,但我更愿意仍然让客户端"自动发现"配置数据.

一些基本的谷歌搜索似乎暗示这是不可能的,但我想从SO获得视图 - 这里有人知道我无法找到的东西吗?:)

编辑::

蒂姆·斯科特和davogones都与一个可能的建议上来了,但一个依赖于分裂system.serviceModel节的组成部分出单独的文件.虽然这并不完全符合我要找的(我想定义每个服务及其相关的元素谨慎,每一个服务文件),它一个选项.我会调查并让你知道我的想法.

davogones.. 17

您可以使用configSource分离WCF配置.说明:

http://weblogs.asp.net/cibrax/archive/2007/07/24/configsource-attribute-on-system-servicemodel-section.aspx

另一种选择是以编程方式配置WCF服务.



1> davogones..:

您可以使用configSource分离WCF配置.说明:

http://weblogs.asp.net/cibrax/archive/2007/07/24/configsource-attribute-on-system-servicemodel-section.aspx

另一种选择是以编程方式配置WCF服务.



2> 小智..:
using System;
using System.Configuration;
using System.IO;
using System.ServiceModel;
using System.ServiceModel.Configuration;

namespace ConsoleHost
{
    public class CustomServiceHost : ServiceHost
    {
        public CustomServiceHost(string customConfigPath, Type serviceType, 
            params Uri[] baseAddresses)
        {
            CustomConfigPath = customConfigPath;
            var collection = new UriSchemeKeyedCollection(baseAddresses);
            InitializeDescription(serviceType, collection);
        }

        public string CustomConfigPath { get; private set; }

        protected override void ApplyConfiguration()
        {
            if (string.IsNullOrEmpty(CustomConfigPath) ||
                !File.Exists(CustomConfigPath))
            {
                base.ApplyConfiguration();
            }
            else
            {
                LoadConfigFromCustomLocation(CustomConfigPath);
            }
        }

        void LoadConfigFromCustomLocation(string configFilename)
        {
            var filemap = new ExeConfigurationFileMap
            {
                ExeConfigFilename = configFilename
            };
            Configuration config = ConfigurationManager.
                OpenMappedExeConfiguration(filemap, ConfigurationUserLevel.None);

            var serviceModel = ServiceModelSectionGroup.GetSectionGroup(config);

            bool loaded = false;
            foreach (ServiceElement se in serviceModel.Services.Services)
            {
                if (se.Name == Description.ConfigurationName)
                {
                    LoadConfigurationSection(se);
                    loaded = true;
                    break;
                }
            }

            if (!loaded)
                throw new ArgumentException("ServiceElement doesn't exist");
        }
    }
}

在这个类之后,只需使用它,就像通常用它来初始化服务主机一样

myServiceHost = new CustomServiceHost(ConfigFileName,typeof(QueryTree));

myServiceHost.Open();



3> Sailing Judo..:

我倾向于以编程方式配置我的所有服务设置.

我的客户并不是理解XML的类型,并且让我让配置文件更像旧的INI风格.

这很容易做到(不包括INI文件代码):

        // create the URI which is used as the service endpoint
        Uri tcpBaseAddress = new Uri(
                string.Format("net.tcp://{0}:{1}",
                    LocalIPAddress.ToString(), GeneralPortNumber));

        // create the net.tcp binding for the service endpoint
        NetTcpBinding ntcBinding = new NetTcpBinding();
        ntcBinding.Security.Mode = SecurityMode.None;
        System.ServiceModel.Channels.Binding tcpBinding = ntcBinding;

        // create the service host and add the endpoint
        Host = new ServiceHost(typeof(WordWarService), tcpBaseAddress);

由于我们可以以编程方式配置主机(和客户端),因此没有任何东西阻止您以您选择的任何方式提供设置(数据库,xml,疯狂文本文件等).


当然 - 这适用于你现在*的特定设置 - 但如果你在代码中配置你的WCF服务,你确实失去了WCF的一些灵活性,能够在XML配置中定义和配置端点等,insteda of码.
以上硬编码的唯一内容是TCP绑定.您可以轻松地从其他来源读取所有其他数据,这就是我所做的.
+1为此.我原则上不喜欢WCF XML配置.大量的样板,难以理解的选项和非常verbsoe语法.让我用Intellisense的代码来做,我不需要学习新的格式,一切都很好.无论如何,我仍然可以将端口号之类的东西委托给自定义设置,正如@SailingJudo提示的那样.:-)
推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有