如何从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或其他技术来托管
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);
}
}