c# - WCF 当前上下文为 Null

标签 c# wcf logging

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

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

大多数情况下这是可行的,但最终 HttpContext.Current 变为 null。这主要发生在 ServiceLevelReceiveRequest 命中跟踪监听器时。

这种行为有原因吗?

最佳答案

这里写在Microsoft's pages .

在 ASP.NET 兼容模式下托管 WCF 服务

虽然 WCF 模型旨在跨托管环境和传输保持一致的行为,但在某些情况下,应用程序通常不需要这种程度的灵 active 。 WCF 的 ASP.NET 兼容模式适用于不需要在 IIS 之外托管或通过 HTTP 以外的协议(protocol)进行通信但使用 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 服务 兼容模式可以通过附加文件系统访问来保证安全 服务的 .svc 文件的控制列表 (ACL)。

  • 可配置的 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 模拟和 WCF 模拟都是 为特定服务操作启用,该服务 实现最终使用从 WCF 获得的身份运行。

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

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

关于c# - WCF 当前上下文为 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18757017/

相关文章:

python - 如何在 Python 中记录包名称?

c# - C# 中 for 循环的正确语法是什么?

c# - 验证两个控件(CustomValidator)

c# - 在 MainActivity 中访问 MainPage.xaml 按钮

c# - 为什么正则表达式匹配抛出异常?

asp.net - WCF vs ASPX webmethods vs ASMX webmethods

c# - 一般计算 WCF 操作执行时间

wcf - DomainContext 中的冲突处理

c# - 如何检查是否设置了 LogWriter?

iphone - 访问用于临时分发的 iPhone 上的崩溃日志