使用单个Windows服务托管4个不同的WCF项目。怎么样?

时间:2018-10-15 03:28:36

标签: c# wcf windows-services

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

对于4个WCF项目中的每个项目,我需要4个Windows服务项目来分别托管。为了最大程度地减少要维护的项目数量,我正在考虑一个Windows服务来安装所有4个WCF项目,以便于维护。无论如何,除了OnStart和OnStop之外,我都叫wcf,那里没有其他逻辑。

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

这可行吗?如果可以,我该如何实现?

1 个答案:

答案 0 :(得分:1)

是的,有可能,您只需要在配置文件中配置每个端点。怎么做:

  1. Windows Service WCF宿主是ServiceHost类,因此您需要为每个合同创建4个宿主。

    var serviceHost =新的ServiceHost(typeof(CommunicationManagement)); serviceHost.Open()

  2. 现在,您可以在“服务”部分配置每个服务端点:

<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>

  1. 在上面您可以看到PhoneAdatpersManagerCommunicationManagement服务,它们托管在单个Windows服务中,并在8000端口上协同工作(但您可以使用不同的端口)。