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

WCF服务自定义配置

如何解决《WCF服务自定义配置》经验,为你挑选了1个好方法。

在托管多个WCF服务的应用程序中,为每个服务添加自定义配置信息的最佳方法是什么?例如,您可能希望传递或设置公司名称或指定connectionString服务或其他一些参数.

我猜这可能是通过实现IServiceBehavior实现的.

即...像....


  
    
      
      
      
    
    
      
      
      
    
  



  
    
    
    
      
        
      
    
  
  
    
    
    
      
        
      
    
  

在MyService上设置ABC,在MyOtherService上设置DEF(假设它们与公司名称有一些共同的接口).

任何人都可以详细说明你如何实现这个?

TIA

迈克尔



1> Cheeso..:

我知道这是旧的,但它从未被标记为已回答,所以我想我会开枪.如果我理解你所追求的是什么,你可以使用自定义的ServiceHostFactory来实现.
好后在这个位置.

您设置yuour自定义ServiceHostFactory,如下所示:

<%@ ServiceHost
 Language="C#"
 Debug="true"
 Service="Ionic.Samples.Webservices.Sep20.CustomConfigService"
 Factory="Ionic.ServiceModel.ServiceHostFactory"%>

然后,在ServiceHostFactory中,您可以覆盖名为ApplyConfiguration的方法.通常,对于在IIS中托管的WCF应用程序,WCF会自动在web.config中查找配置.在此示例中,我们重写该行为以首先查找以WCF服务描述命名的配置文件.

protected override void ApplyConfiguration()
{
    // generate the name of the custom configFile, from the service name:
    string configFilename = System.IO.Path.Combine ( physicalPath,
        String.Format("{0}.config", this.Description.Name));

    if (string.IsNullOrEmpty(configFilename) || !System.IO.File.Exists(configFilename))
        base.ApplyConfiguration();
    else
        LoadConfigFromCustomLocation(configFilename);
}

您可以用"任何东西"替换它 - 例如,在数据库表中查找配置.

还有一些方法可以完成拼图.

private string _physicalPath = null;
private string physicalPath
{
    get
    {
        if (_physicalPath == null)
        {
            // if hosted in IIS
            _physicalPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

            if (String.IsNullOrEmpty(_physicalPath))
            {
                // for hosting outside of IIS
                _physicalPath= System.IO.Directory.GetCurrentDirectory();
            }
        }
        return _physicalPath;
    }
}


private void LoadConfigFromCustomLocation(string configFilename)
{
    var filemap = new System.Configuration.ExeConfigurationFileMap();
    filemap.ExeConfigFilename = configFilename;
    System.Configuration.Configuration config =
        System.Configuration.ConfigurationManager.OpenMappedExeConfiguration
        (filemap,
         System.Configuration.ConfigurationUserLevel.None);
    var serviceModel = System.ServiceModel.Configuration.ServiceModelSectionGroup.GetSectionGroup(config);
    bool loaded= false;
    foreach (System.ServiceModel.Configuration.ServiceElement se in serviceModel.Services.Services)
    {
        if(!loaded)
            if (se.Name == this.Description.ConfigurationName)
            {
                base.LoadConfigurationSection(se);
                loaded= true;
            }
    }

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

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有