我实现了一个自定义WCF跟踪侦听器并将日志写入CSV文件.在自定义侦听器中,我正在尝试访问当前请求Url.
var url = HttpContext.Current != null ?
HttpContext.Current.Request.Url :
null;
Run Code Online (Sandbox Code Playgroud)
大多数时候这种方法有效,但最终HttpContext.Current
成为了null
.这主要发生在ServiceLevelReceiveRequest
命中侦听器时.
这种行为有原因吗?
这里写的是微软的页面.
虽然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授权:当WCF服务在ASP.NET兼容模式下运行时,对WCF请求强制实施ASP.NET的URL授权规则.
HttpModuleCollection可扩展性:因为在ASP.NET兼容模式下运行的WCF服务完全参与ASP.NET HTTP请求生命周期,所以HTTP管道中配置的任何HTTP模块都能够在服务之前和之后对WCF请求进行操作
通过以下配置(位于应用程序的Web.config文件中)在应用程序级别启用WCF的ASP.NET兼容模式:
<system.serviceModel> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> </system.serviceModel>
Run Code Online (Sandbox Code Playgroud)