【发布时间】:2019-06-11 07:55:44
【问题描述】:
我需要将 httpcontext 注入到控制器外部使用的自定义属性中。我在控制器中找到了几种解决方案,但我的情况有点棘手。现在我的 PermissionController 中有以下代码
[PermissionFilter(PermissionEnum.Permission, AccessLevelEnum.Create)] <-- it works perfectly
[HttpPost("users/{userId}")]
public async Task<IActionResult>
AssignPermissionToUser([FromBody] List<PermissionToVM> permissions, int userId)
{
await _permissionService.Assign(permissions); <-- .Assign() extension
//code goes here
}
在上面的方法中有一个扩展方法.Assign的调用。该方法代码如下。
//[SecondPermissionFilter(PermissionEnum.Permission,
AccessLevelEnum.Create)] <-- here I check permissions but don't
know how to inject the httpcontext
public async Task Assign(List<PermissionToVM> permissions)
{
//code goes here
}
正如我访问过的许多网站中提到的那样。这里https://dotnetcoretutorials.com/2017/01/05/accessing-httpcontext-asp-net-core/ 在控制器外部注入httpcontext 可以使用IHttpContextAccessor 完成。问题是我不知道如何使用它而不将它传递给构造函数。我的自定义属性应该被称为装饰器[SecondPermissionFilter(PermissionEnum.Permission, AccessLevelEnum.Create)],当只传递权限设置时,没有任何对httpcontextaccessor的引用。
这甚至可能吗?如果没有,也许还有其他方法可以做到这一点?
编辑:这是SecondPermissionFilter类的代码:
public sealed class SecondPermissionFilterAttribute : Attribute
{
private readonly PermissionEnum _requestedPermission;
private readonly IEnumerable<AccessLevelEnum> _accessLevelCollection;
private readonly IHttpContextAccessor _contextAccessor; //<-- how to inject?
public PermissionFilterAttribute(PermissionEnum requestedPermission, params AccessLevelEnum[] accessLevelCollection)
{
_requestedPermission = requestedPermission;
_accessLevelCollection = accessLevelCollection;
}
}
【问题讨论】:
-
您最好向我们展示您的自定义属性的定义。这就是你可以注入 IHttpContextAccessor 的地方。
-
@Bellash 控制器权限属性有效,我不想修改它。代码中提到的“SecondPermissionFilter”相当简单。我在我的问题中添加了定义。
标签: asp.net-core .net-core custom-attributes httpcontext filterattribute