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

.net NLog:记录在IIS中的WCF应用程序中调用该应用程序的用户,.net,wcf,iis,logging,nlog,.net,Wcf,Iis,Logging,Nlog,我有以下情况: 作为windows托管服务运行的已部署WCF服务。此WCF服务用于将特定事件记录到数据库(NLog v2)。此服务使用basicHttpBinding 在IIS下部署的web应用程序(不同的服务器)。应用程序池在网络服务凭据下运行。web应用程序身份验证是Windows集成的(Active Directory凭据) 每当我从控制台应用程序调用WCF时,我都可以从System.Threading.Thread.CurrentPrincipal.identity.Name获取用户

我有以下情况:

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

  • 在IIS下部署的web应用程序(不同的服务器)。应用程序池在网络服务凭据下运行。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
属性,但它是只读的


有人知道如何解决吗?

可能需要设置impersonateCallerForAllOperations属性


有关详细信息,请参见MSDN:

如果可以从代码中获取用户,则可以执行以下操作:

使用NLog.LayoutRenderers;
...
//注册${myUser},尽快执行此操作(例如app_start)
LayoutRenderer.Register(“myUser”,(logEvent)=>someUser);
现在,您可以在nlog配置1中使用
${myUser}