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 传播