使用单个 Windows 服务托管 4 个不同的 WCF 项目。如何?

Posted

技术标签:

【中文标题】使用单个 Windows 服务托管 4 个不同的 WCF 项目。如何?【英文标题】:Using single windows service to host 4 different WCF projects. How? 【发布时间】:2019-03-19 10:44:31 【问题描述】:

拥有 5 个以上的 WCF 项目。其中 4 个必须作为 Windows 服务托管,1 个必须托管在 IIS 中。都在同一台机器上。

对于 4 个 WCF 项目中的每一个,我需要分别托管 4 个 Windows 服务项目。为了尽量减少要维护的项目数量,我正在考虑使用一个 Windows 服务来安装所有 4 个 WCF 项目,以便于维护。无论如何,除了 OnStart 和 OnStop 我调用 wcf 并且没有其他逻辑。

我看到的挑战是,每个 Windows 服务都需要与 WCF 项目中使用的相同的应用程序配置文件。如果我要通过从应用设置中获取服务名称来动态执行此操作,我将如何加载不同 wcf 项目的 app.config 文件以在运行时作为 Windows 服务托管。

这可行吗?如果是这样,我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

是的,有可能,您只需要在配置文件中配置每个端点。如何做到这一点:

    Windows Service WCF hoster 是ServiceHost 类,因此您需要为每个合约创建 4 个主机。

    var serviceHost = new ServiceHost(typeof(CommunicationManagement)); serviceHost.Open()

    现在您可以在服务部分配置每个服务端点:

<system.serviceModel>
<services>
	<service name="Communication.Service.CommunicationManagement">
		<endpoint
				binding="netTcpBinding" 
					bindingConfiguration="myBinding" 
					contract="Communication.Service.ICommunicationManagement" 
					name="CommunicationManagement">
			<identity>
				<dns value="localhost" />
			</identity>
		</endpoint>
		<endpoint address="MEX" binding="mexHttpBinding" contract="IMetadataExchange" />
		<host>
			<baseAddresses>
				<add baseAddress="http://localhost:8000/Communication/Service/CommunicationManagement" />
			</baseAddresses>
		</host>
	</service>
	<service bname="Communication.Service.Managers.PhoneAdatpersManager">
		<endpoint 
				binding="netTcpBinding"
					bindingConfiguration="myBinding" 
					contract="Communication.IPhoneAdministration"
					name="PhoneAdministration">
			<identity>
				<dns value="localhost" />
			</identity>
		</endpoint>
		<endpoint address="MEX" binding="mexHttpBinding" contract="IMetadataExchange" />
		<host>
			<baseAddresses>
				<add baseAddress="http://localhost:8000/Communication/Service/PhoneAdministration" />
			</baseAddresses>
		</host>
	</service>
</services>
<system.serviceModel>
    您可以在上面看到PhoneAdatpersManagerCommunicationManagement 服务,它们托管在单个Windows 服务中并在8000 端口上协同工作(但您可以使用不同的端口)。

【讨论】:

以上是关于使用单个 Windows 服务托管 4 个不同的 WCF 项目。如何?的主要内容,如果未能解决你的问题,请参考以下文章

从主机 WinForms 程序访问自托管 WCF 服务

我可以在 2 个不同的托管服务中托管我的主域和它的子域吗

Weblogic学习总结——创建一个基本集群

无法在 Windows 7 上的 Windows 服务中使用 netNamedPipeBinding 托管和启动 WCF 服务

使用单个 Azure 应用服务托管多个应用程序/微服务都有哪些限制/缺点?

如何对 Windows 服务中托管的 wcf 服务进行负载/压力测试?