WCF 服务和 ASP.NET

本主题讨论将 Windows Communication Foundation (WCF) 服务与 ASP.NET 并排托管,并在 ASP.NET 兼容模式下托管这些服务。

与 ASP.NET 并排托管 WCF

可以将 WCF 服务托管在 Internet Information Services(IIS)中,且这些服务可以与 ASPX 页面和 ASMX Web 服务一起位于单一的通用应用程序域内。 ASP.NET 为 WCF 和 ASP.NET HTTP 运行时提供常见的基础结构服务,例如 AppDomain 管理和动态编译。 WCF 的默认配置与 ASP.NET 并排。

显示 WCF 服务和 ASP .NET:共享状态的屏幕截图。

ASP.NET HTTP 运行时处理 ASP.NET 请求,但不参与处理发往 WCF 服务的请求,即使这些服务托管在与 ASP.NET 内容相同的 AppDomain 中。 相反,WCF 服务模型会截获寻址到 WCF 服务的消息,并通过 WCF 传输/通道堆栈路由这些消息。

并排模型的结果如下所示:

  • ASP.NET 和 WCF 服务可以共享 AppDomain 状态。 由于这两个框架可以共存在同一 AppDomain 中,WCF 还可以与 ASP.NET(包括静态变量、事件等)共享 AppDomain 状态。

  • WCF 服务的行为一致,独立于托管环境和传输。 ASP.NET HTTP 运行时有意耦合到 IIS/ASP.NET 托管环境和 HTTP 通信。 相反,WCF 旨在跨托管环境(WCF 在 IIS 内外一致地行为)和传输(IIS 7.0 及更高版本中托管的服务在所有公开的终结点上具有一致的行为),即使其中一些终结点使用 HTTP 以外的协议也是如此。

  • 在 AppDomain 中,HTTP 运行时实现的功能适用于 ASP.NET 内容,但不适用于 WCF。 ASP.NET 应用程序平台的许多特定于 HTTP 的功能不适用于 AppDomain 中托管的 WCF 服务,其中包含 ASP.NET 内容。 这些功能的示例包括:

    • 在从 WCF 服务内部访问时,HttpContext:Current 始终为 null。 请改用 RequestContext

    • 基于文件的授权:当确定服务请求是否获得授权时,WCF 安全模型不允许将访问控制列表(ACL)应用于服务的 .svc 文件。

    • 基于配置的 URL 授权:同样,WCF 安全模型不遵循 System.Web 授权元素中指定的任何基于 URL 的 <授权> 规则。 如果服务驻留在受 ASP.NET URL 授权规则保护的 URL 空间中,则 WCF 请求会忽略这些设置。

    • HttpModule 扩展性:当触发 PostAuthenticateRequest 事件时,WCF 托管基础结构会截获 WCF 请求,并且不会将处理返回给 ASP.NET HTTP 管道。 编码为在管道的后期截获请求的模块不截获 WCF 请求。

    • ASP.NET 模拟:默认情况下,WCF 请求总是作为 IIS 进程标识运行,即使将 ASP.NET 设置为使用 System.Web 的 <identity impersonate="true" /> 配置选项来启用模拟也是如此。

这些限制仅适用于 IIS 应用程序中托管的 WCF 服务。 ASP.NET 内容的行为不受 WCF 的存在的影响。

需要 HTTP 管道传统上提供功能的 WCF 应用程序应考虑使用与主机和传输无关的 WCF 等效项:

或者,可以考虑在 WCF 的 ASP.NET 兼容模式下运行服务。

在 ASP.NET 兼容模式下托管 WCF 服务

尽管 WCF 模型旨在跨托管环境和传输一致地运行,但通常在某些情况下,应用程序不需要这种灵活性。 WCF 的 ASP.NET 兼容模式适用于不需要在 IIS 外部托管或通过 HTTP 以外的协议进行通信的方案,但使用 ASP.NET Web 应用程序平台的所有功能。

与默认并行配置不同,WCF 托管基础结构截获 WCF 消息并将其路由出 HTTP 管道,ASP.NET 兼容模式下运行的 WCF 服务将完全参与 ASP.NET HTTP 请求生命周期。 在兼容模式下,WCF 服务通过 IHttpHandler 实现使用 HTTP 管道,类似于处理 ASPX 页面和 ASMX Web 服务请求的方式。 因此,WCF 在以下 ASP.NET 功能上的行为与 ASMX 相同:

  • HttpContext:在 ASP.NET 兼容模式下运行的 WCF 服务可以访问 Current 及其关联状态。

  • 基于文件的授权:在 ASP.NET 兼容模式下运行的 WCF 服务可以通过将文件系统访问控制列表(ACL)附加到服务的 .svc 文件来保护。

  • 可配置的 URL 授权:当 WCF 服务在 ASP.NET 兼容模式下运行时,将为 WCF 请求强制实施 ASP.NET 的 URL 授权规则。

  • HttpModuleCollection 扩展性:由于在 ASP.NET 兼容模式下运行的 WCF 服务完全参与 ASP.NET HTTP 请求生命周期,因此在 HTTP 管道中配置的任何 HTTP 模块都可以在服务调用前后对 WCF 请求进行作。

  • ASP.NET 模拟:WCF 服务使用 ASP.NET 模拟线程的当前标识运行,如果为应用程序启用了 ASP.NET 模拟,则它可能与 IIS 进程标识不同。 如果为特定服务操作启用了 ASP.NET 模拟和 WCF 模拟,则服务实现最终使用从 WCF 获取的身份运行。

WCF 的 ASP.NET 兼容性模式通过以下配置(位于应用程序的 Web.config 文件中)在应用程序级别启用:

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

如果未指定,则此值默认为 falsefalse指示在应用程序中运行的所有 WCF 服务不会在 ASP.NET 兼容模式下运行。

由于 ASP.NET 兼容性模式意味着请求处理语义与 WCF 默认值基本不同,因此单个服务实现能够控制它们是否在启用了 ASP.NET 兼容性模式的应用程序内运行。 服务可用于 AspNetCompatibilityRequirementsAttribute 指示它们是否支持 ASP.NET 兼容模式。 此属性的默认值为 Allowed

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}

下表说明了应用程序范围的兼容性模式设置如何影响单个服务的声明的支持级别:

应用程序范围的兼容性模式设置 [AspNetCompatibilityRequirementsMode]

设置
观察到的结果
aspNetCompatibilityEnabled = “true Required 服务已成功激活。
aspNetCompatibilityEnabled = “true Allowed 服务已成功激活。
aspNetCompatibilityEnabled = “true NotAllowed 当服务收到消息时发生激活错误。
aspNetCompatibilityEnabled = “false Required 当服务收到消息时发生激活错误。
aspNetCompatibilityEnabled = “false Allowed 服务已成功激活。
aspNetCompatibilityEnabled = “false NotAllowed 服务已成功激活。

注释

IIS 7.0 和 WAS 允许 WCF 服务通过 HTTP 以外的协议进行通信。 但是,不允许在启用了 ASP.NET 兼容模式的应用程序中运行的 WCF 服务公开非 HTTP 终结点。 当服务收到其第一条消息时,此类配置将生成激活异常。

有关为 WCF 服务启用 ASP.NET 兼容模式的详细信息,请参阅 AspNetCompatibilityRequirementsMode ASP.NET 兼容性 示例。

另请参阅