c# - 将请求特定的对象从自定义身份验证过滤器共享到 Controller /模型

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

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

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(...);
      ...
}

最佳答案

使用 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" };
}

然后在你的 Controller 中你只需使用以下代码:

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" };
}

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

关于c# - 将请求特定的对象从自定义身份验证过滤器共享到 Controller /模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35588592/

相关文章:

.net - 在 web api 中使用 odata 函数 isof

c# - Web API 2 下载文件使用异步任务<IHttpActionResult>

model-view-controller - 使用带有 MVC 前端的不记名 token API 后端(单独的应用程序)

c# - 将字符串数组从 VB6 传递到 C#.net

c# - 添加到 SQLCommand 后是否可以更改 SQLParameter 的值?

c# - 为什么我不能将 boxed int 转换为可为 null 的 decimal?

c# - 如何在@Html.BeginForm中添加没有值的html属性

c# - Web API 验证提供程序是否有枚举属性?

c# - Web API错误记录

javascript - 带有 Node js 的 CRM WebAPI 2016