NLog:在 IIS 的 WCF 应用程序中记录调用该应用程序的用户

Posted

技术标签:

【中文标题】NLog:在 IIS 的 WCF 应用程序中记录调用该应用程序的用户【英文标题】:NLog: Log the user who called the application in a WCF application in IIS 【发布时间】:2011-08-22 18:46:29 【问题描述】:

我有以下场景:

作为 Windows 托管服务运行的已部署 WCF 服务。此 WCF 服务用于将特定事件记录到数据库 (NLog v2)。此服务使用 basicHttpBinding。

在 IIS 下部署的 Web 应用程序(不同的服务器)。应用程序池在 NETWORK SERVICE 凭据下运行。 Web 应用程序身份验证是 Windows 集成的(Active Directory 凭据)。

每当我从控制台应用程序调用 WCF 时,我都可以从 System.Threading.Thread.CurrentPrincipal.Identity.Name 获取用户身份;当我从 Web 应用程序中调用它时,我希望将 "DOMAIN\SERVER$" 作为线程标识名称(按预期发生)。

我的问题是:我想获取调用 Web 应用程序的用户。我已经尝试在 WCF 服务合同中设置AspNetCompatibilityRequirements 属性,但是 NLog 中的$asp-application$aspnet-user-identity$asp-request 参数被读取为null。 Web 应用程序中的HttpContext 正常,但它没有被发送到 WCF。 NLog.Logger 类中有一个 Credentials 属性,但它是只读的。

有人知道怎么解决吗?

【问题讨论】:

【参考方案1】:

可能需要设置impersonateCallerForAllOperations属性

详见 MSDN:http://msdn.microsoft.com/en-us/library/ms731306.aspx

【讨论】:

【参考方案2】:

如果你可以从代码中获取用户,你可以这样做:

using NLog.LayoutRenderers;

...

// Register $myUser, do this as soon as possible (e.g. app_start)
LayoutRenderer.Register("myUser", (logEvent) => someUser);

现在你可以在你的 nlog config1 中使用$myUser

【讨论】:

以上是关于NLog:在 IIS 的 WCF 应用程序中记录调用该应用程序的用户的主要内容,如果未能解决你的问题,请参考以下文章

Topshelf + ServiceModelEx + Nlog 从头构建WCF

使用 log4net 或 NLog 的 WCF 日志记录/跟踪和活动 ID 传播

微软 WCF的几种寄宿方式,寄宿IIS寄宿winform寄宿控制台寄宿Windows服务

[转]WCF的几种寄宿方式

WCF 异常记录

在 mvc 中使用 WCF 服务时出现问题