我有一个asp.net web-api的设计问题,想知道如何解决这个问题
public abstract class BaseApiController<TEntity> : ApiController where TEntity : Entity
{
protected string GetUsername()
{
return Utilities.GetUsername(Request.Headers.Authorization);
}
//some other code
}
public class StakeholderApiController : BaseApiController<Stakeholders>
{
ILogger _logger = new CustomApiLogger("StkhManager", GetUsername())
//some other code
}
现在我遇到的问题是:
我有BaseApiController,我使用它在所有ApiControllers之间共享某些功能。
然后我有一些指定的ApiController用于某些不共享的功能。
现在在进行日志记录时,我确实要记录登录用户的名称,问题是我每次创建新实例时都必须通过它,有没有办法让我登录用户&# 39; s为当前api请求命名为global,以便可以在任何地方访问它。
我无法将其设为静态,否则对于其他人请求它会给出错误的用户名。
有没有办法可以避免每次传递它。鉴于webapi是无状态的,因此无法使用会话,还有其他方法吗?
我正在使用angularjs前端,因此我没有使用MVC / .net提供的任何授权技术
注意:
由于某些原因,我无法将Logger的创建移动到基类
这只是一个例子,我想在许多其他地方使用登录用户的名字。因此,不想传递它。
答案 0 :(得分:1)
使用ASP.NET Web API设置和访问主体时有一个标准模式。从您ApiController
之类的BaseApiController
,您可以使用User
属性来检索相同内容。要进行设置,通常会从请求对象中获取HttpRequestContext
,并且这样设置主体。
Request.GetRequestContext().Principal = new ClaimsPrincipal(...);
顺便说一句,您可以从任何地方访问Web API管道中的当前请求对象。