我正在编写一个简单的控制台应用程序,它读取在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或其他技术进行托管
答案 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);
}
}