【发布时间】:2021-08-25 07:19:56
【问题描述】:
我有一个这样的控制器:
public class MyController : System.Web.Http.ApiController
{
private ILogger logger;
public MyController(ILogger logger)
{
this.logger = logger;
}
...Methods...
}
记录器需要来自经过身份验证的用户的用户 ID,或者只是一个空的 guid。 据我了解,授权过程是在创建控制器之后执行的,但在执行方法之前。所以在控制器构建过程中,还没有包含UserName、ID、Token等的“用户”。
我可以在这样的任何方法中为 logger 提供它所需的 ID:
var claim = this.ActionContext.RequestContext.Principal.Identity as System.Security.Claims.ClaimsIdentity;
var userId = claim.IsAuthenticated ? new Guid(claim.GetUserId()) : Guid.Empty;
logger.SetUserID(userId);
但不是在每个方法中都这样做,我想在 动作过滤器 中编写此一次,然后用它装饰整个控制器。
问题: 有没有办法在动作过滤器中访问 MyController 的记录器? 像这样的:
public class LoggerFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
base.OnActionExecuting(actionContext);
???---> Check if controller that is currently working has a logger property;
If it has, then ThatController.logger.SetUserID(...);
}
}
【问题讨论】:
标签: c# asp.net controller asp.net-web-api2