我可以在 Windows 服务中托管 WCF 服务吗?

Posted

技术标签:

【中文标题】我可以在 Windows 服务中托管 WCF 服务吗?【英文标题】:Can I host a WCF Service in a windows service? 【发布时间】:2011-07-13 03:27:54 【问题描述】:

我通过添加新项目 -> WCF 服务库创建了一个 WCF 项目,当我在开发环境中运行它时,它会打开 WCF 测试客户端。如何在未安装 Visual Studio 的服务器上安装此服务(我不想在 IIS 上托管它)。我应该编写一个新的 Windows 服务吗?

【问题讨论】:

【参考方案1】:

创建一个 Windows 服务项目。

将您的 WCF 服务添加到此项目。

在主 Windows 服务类(默认为 Service1.cs)中,添加一个成员:

internal static ServiceHost myServiceHost = null;

修改 OnStart() 以使用您的 WCF 服务类型启动新的 ServiceHost:

 protected override void OnStart(string[] args)
    
        if (myServiceHost != null)
        
            myServiceHost.Close();
        

        myServiceHost = new ServiceHost(typeof(MyService));
        myServiceHost.Open();
    

修改 OnStop():

protected override void OnStop()
    
        if (myServiceHost != null)
        
            myServiceHost.Close();
            myServiceHost = null;
        
    

将安装和部署项目(安装项目)添加到您的解决方案中。将该项目的输出设置为 Windows 服务项目的主要输出。构建安装和部署项目时,您应该会看到一个可用于安装服务的 Setup.exe 文件。

请记住,您仍然需要设置端点和绑定。考虑使用 nettcpbinding 进行此设置。

最后一点,如果您在安装后启动 Windows 服务时遇到问题,请参考:Error 5 : Access Denied when starting windows service。

【讨论】:

有什么理由 myServiceHost 是内部的而不是私有的? @ProfK 否。再说一次,我很久以前写过这个答案,所以当时可能有一个完整的上下文。【参考方案2】:

您需要创建一个 Windows 服务项目,然后添加对您的 WCF 服务的引用并托管它。安装服务不需要visual studio,需要使用installutil.exe

看看here。

【讨论】:

【参考方案3】:

看看TopShelf 库。我用它创建了许多 WCF 服务。

提示:如果您打算编写更多 WCF 服务,那么阅读端口共享可能是值得的。

【讨论】:

以上是关于我可以在 Windows 服务中托管 WCF 服务吗?的主要内容,如果未能解决你的问题,请参考以下文章

Windows 窗体中的 WCF 数据服务托管

Windows 服务可以使用由另一个 Windows 服务托管的 WCF 服务吗?

是否可以通过 httpwebrequest 使用 WCF 服务(托管为 Windows 服务托管)?

使用移动设备访问托管在 Windows 服务中的 WCF 服务

我们啥时候应该在 IIS 中托管 WCF 服务,啥时候应该在 Windows 服务中托管?

如何在虚拟机中使用托管在 Windows 服务中的 WCF