虽然使用 ASP.NET MVC 框架可以从 LoginInterceptor 获取操作调用者(检查 this link),但在 ASP.NET Web Api 中,我还没有找到使用带有 Castle Windsor 的拦截器来实现它的正确方法。
另一方面,我找到了一种方法来实现您想要做的事情,利用 Caller Info Attributes 和 Castle Windsor LoggingFacility 组件。
来电信息属性
这些属性是
- [CallerMemberName] - 设置有关呼叫者成员名称的信息。
- [CallerFilePath] - 设置调用者源代码的信息
文件。
- [CallerLineNumber] - 设置来电者的线路号码信息。
你可以这样使用它们(作为可选参数):
public static void ShowCallerInfo([CallerMemberName]
string callerName = null, [CallerFilePath] string
callerFilePath = null, [CallerLineNumber] int callerLine=-1)
{
Console.WriteLine("Caller Name: {0}", callerName);
Console.WriteLine("Caller FilePath: {0}", callerFilePath);
Console.WriteLine("Caller Line number: {0}", callerLine);
}
调用ShowCallerInfo();方法(不带参数)显示:
Caller Name: Main
Caller FilePath: h:\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1\Class1.cs
Caller Line number: 7
记录设施
Castle Windsor 提供了LoggingFacility 组件作为日志记录的替代方案(使用注入而不是拦截),它允许在您的方法中进行日志记录,而不仅仅是在之后和之前(允许使用拦截器)。
只需以这种方式注册您的 Logger:
container.AddFacility<LoggingFacility>(f => f.UseNLog().WithConfig("NLog.config"));
自动注入可在您的代码中使用的 ILogger 对象。
public class MyController : ApiController
{
public ILogger Logger { get; set; }
[HttpGet]
public IHttpActionResult Get()
{
Logger.Info("Log Test");
…
}
...
}
查看link 和link 了解更多信息。
示例
因此,例如,您可以混合使用这两种功能以通过这种方式在控制器操作中实现登录:
public class MyController : ApiController
{
// Make Logger optional
private ILogger logger = NullLogger.Instance;
public ILogger Logger
{
get { return logger; }
set { logger = value; }
}
[HttpGet]
public IHttpActionResult Get()
{
loggerError("Error");
...
return Ok();
}
....
public void loggerError(string message,
[CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0)
{
Logger.Error(message +
" - Caller Name: " + memberName
+ " - Caller FilePath: " + sourceFilePath
+ " - Line number: " + sourceLineNumber
);
}
...
}