从自定义身份验证筛选器到控制器/模型共享请求特定的对象

时间:2016-02-23 21:31:34

标签: c# asp.net-web-api asp.net-web-api2 c#-5.0

我的API自定义身份验证从数据库填充实体。如何与我的控制器共享此特定于请求的对象(在下面的情况下映射'),以便我不必为相同的信息两次查询数据库?

public class CustomAuth : Attribute, IAuthenticationFilter, IDisposable
{
    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken){
      var query = _readEntities.Query<API_Exe_Mapping>();
      var mapping = await query.FirstOrDefaultAsync(...);
      ...
}

1 个答案:

答案 0 :(得分:2)

使用HttpRequestMessage.Properties

您可以使用HttpRequesteMessage.Properties这样的属性:

public async Task AuthenticateAsync(HttpAuthenticationContext context, System.Threading.CancellationToken cancellationToken)
{
    // your code here 
    context.Request.Properties["MyDataKey"] = new List<string> { "from my properties" };
}

然后在您的控制器中,您只需使用以下代码:

var data = this.ActionContext.Request.Properties["MyDataKey"];

为每个http请求清除集合。

使用HttpContext.Current.Items

您可以使用以下解决方案之一,它将使用静态属性HttpContext.Current.Items

public async Task AuthenticateAsync(HttpAuthenticationContext context, System.Threading.CancellationToken cancellationToken)
{
    // your code here 
    HttpContext.Current.Items["MyDataKey"] = new List<string> { "from my items" };
}

然后在您的控制器中,您只需检查相同的字典集合HttpContext.Current.Items并使用相同的密钥检索数据。当http请求终止时,将清除Items集合。