使用单个 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>
-
您可以在上面看到
PhoneAdatpersManager
和CommunicationManagement
服务,它们托管在单个Windows 服务中并在8000 端口上协同工作(但您可以使用不同的端口)。
【讨论】:
以上是关于使用单个 Windows 服务托管 4 个不同的 WCF 项目。如何?的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Windows 7 上的 Windows 服务中使用 netNamedPipeBinding 托管和启动 WCF 服务