在代码中访问App.Config文件的System.ServiceModel部分

时间:2012-01-13 11:27:26

标签: wcf app-config configurationmanager

我在控制台应用程序中托管了一个简单的WCF服务,我想要做的是在控制台上显示app.config信息,例如基地址和端点信息,而不使用代码中的硬编码值。

这一切都可能吗?在生产环境中,这听起来像是一个相当合理的场景,应用程序对配置的设置方式感兴趣吗?

这是主机代码......

class Program
{
    static void Main(string[] args)
    {

        using (ServiceHost host = new ServiceHost(typeof(ServiceImp.ServiceA)))
        {
            host.Open();

            // I would like to display info here
            // Console.Writeline ("Service hosted @ baseadress...., endpoint ABC is...");

            Console.WriteLine();
            Console.WriteLine("Press <ENTER> to terminate Host");
            Console.ReadLine();
        }
    }
}

谷歌搜索似乎只建议使用ConfigurationManager.AppSettings,但这只能访问AppSettings而不是System.ServiceModel内容。

提前致谢

3 个答案:

答案 0 :(得分:2)

通过System.ServiceModel.Configuration命名空间提供对配置的访问。但是,如果ServiceHost实例已经打开,您还可以通过它访问大多数信息。

示例:

// BaseAddress
Console.WriteLine(serviceHost.BaseAddress);

// Endpoints (non-MEX)
foreach (ServiceEndpoint ep in serviceHost.Description.Endpoints)
{
  if (serviceHost.BaseAddress.Any(uri => uri.Equals(ep.ListenUri) &&
      ep.Contract.ContractType != typeof(IMetadataException))
  {
    Console.WriteLine("ListenURI: " + ep.ListenUri);
    Console.WriteLine("  Name   : " + ep.Name);
    Console.WriteLine("  Binding: " + ep.Binding.GetType().FullName);
  }
}

// List of MEX endpoints:
foreach (ServiceEndpoint ep in serviceHost.Description.Endpoints)
{
  if (ep.Contract.ContractType == typeof(IMetadataExchange))
  {
    Console.WriteLine(ep.ListenUri.ToString());
  }
}

只需浏览ServiceHost类,特别是Description属性。

答案 1 :(得分:0)

从您的控制台应用程序执行以下操作,阅读完整的app.config。

XDocument doc = XDocument.Load(Assembly.GetExecutingAssembly().Location +".config");

现在,您将获得doc对象中app.config的内容,您可以通过它迭代查找system.servicemodel部分并获取所需的值。

希望有所帮助。

答案 2 :(得分:0)

如果您想在没有ServiceHost实例的情况下执行此操作,可以使用以下代码。

ServiceModelSectionGroup section = ServiceModelSectionGroup.GetSectionGroup(config);

代码假定您具有对应用程序的Configuration对象的引用。您可以使用WebConfigurationManager或ConfigurationManager对象来获取它。