WCF学习(3) 用Windows服务发布WCF服务

来源:互联网 发布:jar包日志 linux 输出 编辑:程序博客网 时间:2024/06/08 04:05

WCF学习(3) 用Windows服务寄宿WCF服务

WCF服务要变为活动状态,必须承载于创建它并控制它的上下文和生存期的运行时环境中。WCF 提供了统一编程模型,用于生成面向服务的应用程序。 此编程模型保持一致且独立于部署服务的运行时环境。目前为止承载WCF服务的方式有:

  • 托管应用程序中的自承载

    WCF 服务可以承载于任何托管应用程序中。两个常见做法:在控制台应用程序内运行的 WCF 服务;以及丰富客户端应用程序,如基于 Windows Presentation Foundation (WPF) 或 Windows 窗体 (WinForms) 的应用程序

  • 托管 Windows 服务

    注册 WCF 服务作为托管 Windows 服务承载于其中的应用程序域 (AppDomain),以便服务的进程生存期由 Windows 服务的服务控制管理器 (SCM) 控制

  • Internet 信息服务 (IIS)

    IIS 宿主选项与 ASP.NET 集成在一起,并使用这些技术提供的功能,如进程回收、空闲关闭、进程状况监视和基于消息的激活

  • Windows 进程激活服务 (WAS)

    Windows 进程激活服务 (WAS) 是在 Windows Server 2008 上也可用的 Windows Vista 的新进程激活机制。 它保留了熟悉的 IIS 6.0 进程模型(应用程序池和基于消息的进程激活)和承载功能(如快速失败保护、运行状况监视和回收),但是它从激活体系结构中移除了对 HTTP 的依赖。IIS 7.0 使用 WAS 通过 HTTP 完成基于消息的激活。 其他 WCF 组件也插入了 WAS,以通过 WCF 支持的其他协议(如 TCP、MSMQ 和命名管道)提供基于消息的激活。 这样,使用通信协议的应用程序就可以使用 IIS 功能(如进程回收、快速失败保护)和仅对基于 HTTP 的应用程序可用的通用配置系统

宿主环境比较

宿主环境 常见方案 主要优点和限制 托管应用程序中的自承载 1.在开发期间使用的控制台应用程序 2.访问服务的丰富WinForm和WPF客户端应用程序 1.很灵活。2.易于部署。3.不是服务的企业解决方案。 托管Windows服务 承载在IIS外、长时间运行的 WCF 服务 1.由操作系统控制的服务进程生存期,而不是消息激活的。2.受所有 Windows 版本的支持。3.安全环境。 Internet信息服务(IIS) 1.运行带有 WCF 内容的 ASP.NET 服务。 2.使用各种传输协议在 Internet 上运行 WCF 服务。 1.进程回收。2.空闲关闭。3.进程状况监视。4.基于消息的激活。5.仅限 HTTP。 Windows 进程激活服务 (WAS) 使用各种传输协议在 Internet 上运行 WCF 服务,而无须安装 IIS。 1.不需要 IIS。2.进程回收。3.空闲关闭。3.进程状况监视。4.基于消息的激活。5.使用 HTTP、TCP、命名管道和 MSMQ

用Windows服务承载WCF服务实例

  • Demo结构

    这里写图片描述

  • Windows服务实现步骤

    可以通过VS直接添加Windows服务项目,集成了以下三个步骤,如下图
    这里写图片描述

    1. 从 ServiceBase 服务协定接口继承,将该服务同时实现为 Windows 服务和 WCF 服务。
    2. 然后创建 ServiceHost,在被重写的 OnStart(String[]) 方法内打开它并在被重写的 OnStop() 方法内关闭它。
    3. 还必须实现从 Installer 继承的安装程序类,以允许 Installutil.exe 工具将程序安装为 Windows 服务。
  • 服务安装

    1. 直接用命令行
      这里写图片描述

    2. 批处理命令

@echo offset /p var=是否要安装WCF服务(Y/N):if "%var%" == "y" (goto uninstall) else (goto batexit):installcopy C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe  InstallUtil.exe /Ycall InstallUtil.exe WindowsService.execall sc start "WCFService"pause:batexitexit

服务安装

@echo offset /p var=是否要卸载 WCF服务(Y/N):if "%var%" == "y" (goto uninstall) else (goto batexit):uninstallcall sc stop "WCFService"call sc delete "WCFService"pause:batexitexit

服务卸载


  • 服务安装成功之后
    Windows服务
    Windows服务

    元数据
    元数据

总结

windows服务发布成功之后,创建客户端去调服务遇到了问题,直接返回:调用目标发生异常,检查服务端代码,用自寄宿的方式调用没有问题,猜测是服务启动有问题,利用附加到进程的方式,将代码附加到所发布的Windows服务上,调试发现客户端访问WCF过程遇到问题:缺少某个依赖项目,仔细检查发现是WCF服务的一些配置和依赖项也要引用添加到Windows服务的目录下,修改成功之后,调用正常返回结果
这里写图片描述


参考

1. 如何在托管 Windows 服务中承载 WCF 服务

2. 如何承载WCF服务