开发和部署 Internet Information Services(IIS)中托管的 Windows Communication Foundation (WCF) 服务包括以下任务:
确保正确安装并注册 IIS、ASP.NET、WCF 和 WCF 激活组件。
创建新的 IIS 应用程序,或重复使用现有的 ASP.NET 应用程序。
为 WCF 服务创建 .svc 文件。
将服务实现部署到 IIS 应用程序。
配置 WCF 服务。
有关创建 IIS 托管的 WCF 服务的详细演练,请参阅 如何:在 IIS 中托管 WCF 服务。
确保正确安装和注册 IIS、ASP.NET 和 WCF
必须安装 WCF、IIS 和 ASP.NET,以便 IIS 托管的 WCF 服务正常运行。 安装 WCF(作为 .NET Framework 的一部分)、ASP.NET 和 IIS 的过程因作系统而异。 有关安装 WCF 和 .NET Framework 的详细信息,请参阅 安装面向开发人员的 .NET Framework。 若要在 Windows 10 上安装 IIS,请在控制面板中打开“程序和功能”,然后选择“打开或关闭 Windows 功能”。 在 Windows 功能中,选择 “Internet Information Services ”,然后选择“ 确定”。
有关在其他作系统上安装 IIS 的说明,请参阅在 Windows Vista 和 Windows 7 上安装 IIS ,并在 Windows Server 2012 R2 上安装 IIS 8.5。
如果计算机上已存在 IIS,.NET Framework 的安装过程会自动向 IIS 注册 WCF。 如果在 .NET Framework 之后安装 IIS,则需要执行其他步骤,以便向 IIS 注册 WCF 并 ASP.NET。 具体可以根据您的操作系统按如下方式进行操作:
Windows 7 和 Windows Server 2003:使用 ServiceModel 注册工具(ServiceModelReg.exe) 工具向 IIS 注册 WCF。 若要使用此工具,请在
ServiceModelReg.exe /i /x
中输入。Windows 7:最后,必须验证是否已将 ASP.NET 配置为使用 .NET Framework 版本 4 或更高版本。 要实现这一点,请使用
–i
选项运行 ASPNET_Regiis 工具。 有关详细信息,请参阅 ASP.NET IIS 注册工具。
创建新的 IIS 应用程序或重复使用现有 ASP.NET 应用程序
IIS 托管的 WCF 服务必须驻留在 IIS 应用程序中。 可以创建新的 IIS 应用程序以独占方式托管 WCF 服务。 或者,可以将 WCF 服务部署到已托管 ASP.NET 2.0 内容的现有应用程序中(如.aspx页面和 ASP.NET Web 服务 [ASMX])。 有关这些选项的详细信息,请参阅 WCF 服务和 ASP.NET 中的“与 ASP.NET 并排托管 WCF 服务”和“在 ASP.NET 兼容模式下托管 WCF 服务”部分。
请注意,IIS 6.0 及更高版本会定期重启独立的面向对象的编程应用程序。 默认值为 1740 分钟。 支持的最大值为 71,582 分钟。 可以禁用此重启。 有关此属性的详细信息,请参阅 PeriodicRestartTime。
为 WCF 服务创建 .svc 文件
IIS 中托管的 WCF 服务表示为 IIS 应用程序中的特殊内容文件(.svc 文件)。 此模型类似于 ASMX 页在 IIS 应用程序中表示为 .asmx 文件的方式。 .svc 文件包含特定于 WCF 的处理指令(@ServiceHost),该指令允许 WCF 托管基础结构激活托管服务以响应传入消息。 .svc 文件的最常见语法位于以下语句中。
<% @ServiceHost Service="MyNamespace.MyServiceImplementationTypeName" %>
它由 @ServiceHost 指令和单个属性 Service
组成。 特性的值 Service
是服务实现的公共语言运行时 (CLR) 类型名称。 使用此指令基本上等同于使用以下代码创建服务主机。
new ServiceHost( typeof( MyNamespace.MyServiceImplementationTypeName ) );
还可以执行其他托管配置,例如为服务创建基址列表。 还可以使用自定义 ServiceHostFactory 扩展指令以用于自定义托管解决方案。 托管 WCF 服务的 IIS 应用程序不负责管理实例的 ServiceHost 创建和生存期。 托管 WCF 托管基础结构在收到 .svc 文件的第一个请求时动态创建必要的 ServiceHost 实例。 在代码显式关闭该实例之前或回收应用程序时,不释放该实例。
有关 .svc 文件的语法的详细信息,请参阅 @ServiceHost。
将服务实现部署到 IIS 应用程序
IIS 中托管的 WCF 服务使用与 ASP.NET 2.0 相同的动态编译模型。 与 ASP.NET 一样,可以在各种位置以多种方式部署 IIS 托管 WCF 服务的实现代码,如下所示:
作为预编译 .dll 文件,位于全局程序集缓存 (GAC) 或应用程序的 \bin 目录中。 在部署类库的新版本之前,不会更新预编译的二进制文件。
作为未编译的源文件,位于应用程序的 \App_Code 目录中。 处理应用程序的第一个请求时,动态需要此目录中的源文件。 对 \App_Code 目录中文件所做的任何更改都会导致收到下一个请求时回收并重新编译整个应用程序。
未编译的代码直接被放入 .svc 文件中。 实现代码也可以位于服务的 .svc 文件中,在@ServiceHost指令之后。 对内联代码所做的任何更改都会导致在收到下一个请求时回收和重新编译应用程序。
有关 ASP.NET 2.0 编译模型的详细信息,请参阅 ASP.NET 编译概述。
配置 WCF 服务
IIS 托管的 WCF 服务将其配置存储在应用程序 Web.config 文件中。 IIS 承载的服务使用与 IIS 外部托管的 WCF 服务相同的配置元素和语法。 但是,以下约束对 IIS 托管环境是唯一的:
IIS 托管服务的基址。
在 IIS 外部托管 WCF 服务的应用程序可以通过将一组基址 URI 传递给 ServiceHost 构造函数或通过在服务的配置中提供 <主机> 元素来控制它们托管的服务的基址。 IIS 中托管的服务无法控制其基址;IIS 托管服务的基址是其 .svc 文件的地址。
IIS-Hosted 服务的终结点地址
承载于 IIS 中时,任何终结点地址始终被认为相对于表示服务的 .svc 文件的地址。 例如,WCF 服务的基址是 http://localhost/Application1/MyService.svc
,并且具有以下的终结点配置:
<endpoint address="anotherEndpoint" />
这提供了一个可以在 http://localhost/Application1/MyService.svc/anotherEndpoint
处访问的终结点。
同样,使用空字符串作为相对地址的终结点配置元素提供了可访问的 http://localhost/Application1/MyService.svc
终结点,即基址。
<endpoint address="" />
对于承载于 IIS 中的服务的终结点,必须始终使用相对终结点地址。 如果终结点地址不指向承载公开终结点的服务的 IIS 应用程序,那么提供完全限定的终结点地址(例如 http://localhost/MyService.svc
)可能会导致服务部署中的错误。 对托管服务使用相对终结点地址可避免这些潜在的冲突。
可用交通工具
IIS 5.1 和 IIS 6.0 中托管的 WCF 服务仅限于使用基于 HTTP 的通信。 在这些 IIS 平台上,将托管服务配置为使用非 HTTP 绑定会导致在服务激活期间出错。 对于 IIS 7.0,支持的传输包括 HTTP、Net.TCP、Net.Pipe、Net.MSMQ 和 msmq.formatname,以实现与现有 MSMQ 应用程序的向后兼容性。
HTTP 传输安全性
只要包含服务的 IIS 虚拟目录支持这些设置,IIS 托管 WCF 服务就可以利用 HTTP 传输安全性(例如 HTTPS 和 HTTP 身份验证方案(如基本身份验证、摘要身份验证和 Windows 集成身份验证)。 托管终结点绑定上的 HTTP 传输安全设置必须与包含它的 IIS 虚拟目录中的传输安全设置匹配。
例如,配置为使用 HTTP 摘要身份验证的 WCF 终结点必须驻留在配置为允许 HTTP 摘要身份验证的 IIS 虚拟目录中。 IIS 设置和 WCF 终结点设置不匹配的组合会导致服务激活期间出错。