4

我实现了一个自定义 WCF 跟踪侦听器并将日志写入 CSV 文件。在自定义侦听器中,我试图访问当前的请求 URL。

var url =  HttpContext.Current != null ? 
           HttpContext.Current.Request.Url : 
           null;

大多数情况下,这有效,但最终HttpContext.Current变为null. 这主要发生在 aServiceLevelReceiveRequest命中跟踪侦听器时。

这种行为有原因吗?

4

2 回答 2

5

这里写在微软的页面上

在 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 服务请求的方式。因此,在以下 ASP.NET 功能方面,WCF 的行为与 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 获得的标识运行。

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

  <system.serviceModel>        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />    </system.serviceModel>
于 2013-09-12T06:41:24.803 回答
4

WCF 服务中的 HttpContext.Current 是否始终为空?我相信您会想要使用 OperationContext.Current intsad。

于 2013-09-13T02:09:09.140 回答