WCF当前上下文为空

Raa*_*esh 4 c# wcf logging

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

var url =  HttpContext.Current != null ? 
           HttpContext.Current.Request.Url : 
           null;
Run Code Online (Sandbox Code Playgroud)

大多数时候这种方法有效,但最终HttpContext.Current成为了null.这主要发生在ServiceLevelReceiveRequest命中侦听器时.

这种行为有原因吗?

Zah*_*med 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及其关联状态.
  • 基于文件的授权:通过将文件系统访问控制列表(ACL)附加到服务的.svc文件,可以安全地在ASP.NET兼容模式下运行的WCF服务.
  • 可配置的URL授权:当WCF服务在ASP.NET兼容模式下运行时,对WCF请求强制实施ASP.NET的URL授权规则.

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

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

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

  <system.serviceModel>        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />    </system.serviceModel>
Run Code Online (Sandbox Code Playgroud)