gpt4 book ai didi

c# - 在单个 Windows 服务中托管数十个 WCF 服务的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-30 22:33:55 25 4
gpt4 key购买 nike

我的任务是将数十个 WCF 服务迁移到单个 Windows 服务。我使用 Windows 服务模板创建了一个 Windows 服务,并将以下代码添加到 ServiceHostController:

public partial class ServiceHostController : ServiceBase
{
private List<ServiceHost> serviceHosts;

public ServiceHostController()
{
InitializeComponent();
this.ServiceName = "WCFServices";
this.CanStop = true;
this.AutoLog = true;
}

protected override void OnStart(string[] args)
{
if (serviceHosts != null)
{
foreach (var service in serviceHosts)
{
service.Close();
}
}

InitializeServices();
foreach (var service in serviceHosts)
{
service.Open();
}
}

protected override void OnStop()
{
if (serviceHosts != null)
{
foreach (var service in serviceHosts)
{
service.Close();
}
serviceHosts.Close(); = null;
}

foreach (var service in serviceHosts)
{
service.Close();
}
}

private void InitializeServices()
{
serviceHosts = new List<ServiceHost>()
{
new ServiceHost(typeof(WCFService1)),
new ServiceHost(typeof(WCFService2)),
// add dozens of services here
};
}
}

除了不遵循此处的“不要重复自己”规则(实际代码不同)之外,我应该如何在 Windows 服务代码中托管这些 WCF 服务?

最佳答案

汉斯,你做对了一切,但我会替换你的 InitializeServices();使用以下代码。它是伪代码,因此您需要替换这些位:)

1) 在 app.config 中配置你的端点

2) 从您的服务项目\程序集获取您的服务类型

  Dictionary<Type, Type> mappings = new Dictionary<Type,Type>();

foreach (Type t in MyServiceAssembly.GetTypes())
{
if (t.GetInterfaces().Length > 0)
{
foreach (Type ti in t.GetInterfaces())

{
if (mapping.ContainsKey(ti))
System.Diagnostics.Debug.WriteLine("Class {0} implements more than one interface {1}", t.FullName, ti.FullName);
else
mapping.Add(ti, t);

// System.Diagnostics.Debug.WriteLine("Class {0} implements {1}", t.FullName, ti.FullName);
}
}
}

4) 如果你想从 app.config 控制端点 现在迭代你的端点并获得相应的服务实现然后创建你的主机

//在服务启动时读取端点

 List<ServiceHost> serviceHosts = new List<ServiceHost>();

ServicesSection servicesSection = (ServicesSection)WebConfigurationManager.GetSection("system.serviceModel/services");

for(int i = 0;i<servicesSection.Services.Count;i++)
{
ServiceEndpointElement endpoint = servicesSection.Services[i].Endpoints[0];
string url = string.Format("net.tcp://{0}:{1}/YouNameSpace_service_Name_From_EndPoint/{2}.svc","YourHost","YourPort");
ServiceHost serviceHost = new ServiceHost(mappings[endpoint.Contract] , new Uri(url));

serviceHost.Open();

mServiceHosts.Add(serviceHost);
}

5) 如果您不想从 app.config 控制端点,则遍历您的映射列表。

//在您的服务启动时执行此操作

 List<ServiceHost> serviceHosts = new List<ServiceHost>();

foreach(type t in mappings.Keys)
{
string url = string.Format("net.tcp://{0}:{1}/YouNameSpace_{2}.svc","YourHost","YourPort",t.name);
ServiceHost serviceHost = new ServiceHost(mappings[t] , new Uri(url));

serviceHost.Open();

mServiceHosts.Add(serviceHost);
}

关于c# - 在单个 Windows 服务中托管数十个 WCF 服务的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8069854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com