我有一个包含许多网页和一些 WCF 服务的网站。
我有一个日志记录 IHttpModule 订阅 PreRequestHandlerExecute 并设置许多 log4net MDC 变量,例如:
MDC.Set("path", HttpContext.Current.Request.Path);
string ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if(string.IsNullOrWhiteSpace(ip))
ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
MDC.Set("ip", ip);
这个模块适用于我的 aspx 页面。
为了使模块能够与 WCF 一起使用,我在 web.config 中设置了 aspNetCompatibilityEnabled="true",并在服务上设置了 RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed。
但是当调用服务方法时,MDC 不再包含任何设置值。我已经确认它们是通过在 PreRequestHandlerExecute 中放置一个日志记录方法来设置的。
我认为 MDC 正在丢失这些值,因为在日志中我可以看到 PreRequestHandlerExecute 处理程序方法和服务方法调用在不同的线程上。
在 wcf PerSession 服务中使用 ThreadContext.Properties发布log4net建议使用 log4net.GlobalContext 但我认为如果两个用户同时访问应用程序,因为 GlobalContext 由所有线程共享,该解决方案会遇到问题。
有没有办法使这项工作?