如何从app.config中读取服务设置并初始化servicehost

本文关键字:设置 服务 初始化 servicehost 读取 app config | 更新日期: 2023-09-27 17:53:45

我正在编写一个简单的控制台应用程序,它读取应用程序中配置的所有wcf服务。配置并使用自托管来托管这些服务。我在这里看到了一篇类似的文章,但我不知道解决方案如何适合我的情况。
我在一个单独的项目中创建了一个简单的WCF服务。
我现在创建一个新的控制台项目。我在这里正确设置了服务的代理。
现在我想从app.config文件中读取服务设置。使用这些设置来动态初始化服务主机对象。打开服务,然后执行我的其他任务。

我有下面的代码来读取app.config。

private static void ReadServiceConfig()
    {
        IList<ServiceHost> hosts = new List<ServiceHost>();
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        ClientSection clientSection = (ClientSection)config.GetSection("system.serviceModel/client");
        if (clientSection != null)
        {
            ChannelEndpointElementCollection endpoints = clientSection.Endpoints;
            foreach (ChannelEndpointElement endpoint in endpoints)
            {
                ServiceHost host = new ServiceHost(endpoint.Contract.GetType(), endpoint.Address);
                //Lost at this point. Not sure how to add service endpoints here
            }
        }
    }

这里的硬编码版本,

private static void RunWcfServices()
    {
        try
        {
            Uri studentAddress = new Uri("http://localhost:8733/SchoolStudentService");
            ServiceHost studentHost = new ServiceHost(typeof(SchoolStudentService), studentAddress);
            studentHost.AddServiceEndpoint(typeof(TestWcfServices.IStudentService), new WSHttpBinding(), studentAddress);
            ServiceMetadataBehavior behaviour = new ServiceMetadataBehavior();
            behaviour.HttpGetEnabled = true;
            studentHost.Description.Behaviors.Add(behaviour);
            Uri employeeAddress = new Uri("http://localhost:8734/CompanyEmployeeService");
            ServiceHost employeeHost = new ServiceHost(typeof(CompanyEmployeeService), employeeAddress);
            employeeHost.AddServiceEndpoint(typeof(TestWcfServices.IEmployeeService), new WSHttpBinding(), employeeAddress);
            employeeHost.Description.Behaviors.Add(behaviour);
            studentHost.Open();
            employeeHost.Open();
        }
        catch (Exception exp)
        {
            Console.WriteLine(exp.Message);
        }
    }

我有端点详细信息,但那些是字符串。我不想在我的代码中硬编码任何东西,因为我想通过配置驱动所有东西。

看了网上的文章后,我觉得这可以用ServiceHostFactory类来实现。但是问题仍然存在,我将如何获得ServiceHostFactory类所需的端点详细信息。

有什么建议吗?

请注意:我没有。svc文件,不想使用IIS或其他技术来托管

如何从app.config中读取服务设置并初始化servicehost

            var clientSection = config.GetSectionGroup("system.serviceModel").Sections[2].ElementInformation;
            PropertyInformationCollection endpoints = clientSection.Properties;
            foreach (PropertyInformation endpoint in endpoints)
            {
                foreach (ServiceElement key in (ServiceElementCollection)endpoint.Value)
                {
                    var j = key.Endpoints[0];
                    ServiceHost host = new ServiceHost(j.Contract.GetType(), new Uri(key.Host.BaseAddresses[0].BaseAddress));
                    host.AddServiceEndpoint(j.Contract.GetType(), new BasicHttpBinding(), j.Address);
                }
            }