自托管::如何从app.config读取服务设置并初始化servicehost

时间:2015-06-06 15:56:09

标签: c# wcf

我正在编写一个简单的控制台应用程序,它读取在application.config中配置的所有wcf服务,然后使用自托管来托管这些服务。 我遇到了类似的文章here,但我没有得到解决方案如何符合我的情况。
我在一个单独的项目中创建了一个简单的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);
        }
    }

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

浏览完Internet上的文章后,我觉得可以使用ServiceHostFactory类实现。但问题仍然存在,我将如何获得ServiceHostFactory类所需的终点详细信息。

有什么建议我怎么能把这个拿走?

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

1 个答案:

答案 0 :(得分:1)

            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);
                }
            }