我实现了一个自定义WCF跟踪侦听器并将日志写入CSV文件。在自定义侦听器中,我正在尝试访问当前请求Url。
var url = HttpContext.Current != null ?
HttpContext.Current.Request.Url :
null;
大部分时间都有效但最终HttpContext.Current
变为null
。这主要发生在ServiceLevelReceiveRequest
命中跟踪侦听器时。
这种行为有原因吗?
答案 0 :(得分:5)
这里用Microsoft's pages写的。
虽然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的行为相同:
可配置的URL授权:ASP.NET的URL授权规则是 在WCF服务在ASP.NET中运行时强制执行WCF请求 兼容模式。
HttpModuleCollection扩展性:因为WCF服务在运行 ASP.NET兼容模式完全参与ASP.NET HTTP 请求生命周期,HTTP管道中配置的任何HTTP模块都是 能够在服务之前和之后对WCF请求进行操作
通过以下配置(位于应用程序的Web.config文件中)在应用程序级别启用WCF的ASP.NET兼容模式:
<system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> </system.serviceModel>
答案 1 :(得分:3)
在WCF服务中,HttpContext.Current是否始终为null?我相信你会想要使用OperationContext.Current intsead。