在托管多个WCF服务的应用程序中,为每个服务添加自定义配置信息的最佳方法是什么?例如,您可能希望传递或设置公司名称或指定connectionString服务或其他一些参数.
我猜这可能是通过实现IServiceBehavior实现的.
即...像....
在MyService上设置ABC,在MyOtherService上设置DEF(假设它们与公司名称有一些共同的接口).
任何人都可以详细说明你如何实现这个?
TIA
迈克尔
我知道这是旧的,但它从未被标记为已回答,所以我想我会开枪.如果我理解你所追求的是什么,你可以使用自定义的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"); }