WCF当前上下文为空

时间:2013-09-12 06:34:40

标签: c# wcf logging

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

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

大部分时间都有效但最终HttpContext.Current变为null。这主要发生在ServiceLevelReceiveRequest命中跟踪侦听器时。

这种行为有原因吗?

2 个答案:

答案 0 :(得分:5)

这里用Microsoft's pages写的。

在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服务可以 访问当前及其相关状态。
  • 基于文件的授权:在ASP.NET中运行的WCF服务 通过附加文件系统访问可以保护兼容模式 控制列表(ACL)到服务的.svc文件。
  • 可配置的URL授权:ASP.NET的URL授权规则是 在WCF服务在ASP.NET中运行时强制执行WCF请求 兼容模式。

  • HttpModuleCollection扩展性:因为WCF服务在运行 ASP.NET兼容模式完全参与ASP.NET HTTP 请求生命周期,HTTP管道中配置的任何HTTP模块都是 能够在服务之前和之后对WCF请求进行操作

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

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

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

答案 1 :(得分:3)

在WCF服务中,HttpContext.Current是否始终为null?我相信你会想要使用OperationContext.Current intsead。