访问ApiController键入DelegatingHandler(Accessing ApiCo

2019-08-17 03:49发布

我使用Asp.Net的WebAPI的一个项目。 我目前工作的认证和授权。

我有一个的MessageHandler,将检查请求的HTTP认证头,并建立自己的身份和用户配置文件。 不过,我想用注释声称,行动可能需要(我们有很多的用户可以拥有的权利要求的,所以我不希望加载它们全部)我的控制器动作(或只是控制器)。

例如:

public class MyController : ApiController
{
    [LoadClaims("SomeClaim", "SomeOtherClaim", "etc")]
    public string Get()
    {
        if (HasClaim("SomeClaim"))
            return "Awesome";

        return "Bummer";
    }
}

认证消息处理函数中我希望能够看看属性和提出索赔的权利从DB回基于仅需要什么。 为此,我需要知道什么控制器和动作我会打根据路线:

 protected override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
...

            var routeData = request.GetRouteData();
            object controllerName;
            object actionName;
            routeData.Values.TryGetValue("controller", out controllerName);
...

所以,我可以得到的。 但现在我需要把它变成一个类型,我可以反映,但我已经是控制器的名字(甚至没有完整的类名或命名空间)。 我怎样才能变成东西,我可以反映获得属性等等呢?

我期待到DefaultHttpControllerSelector看到的WebAPI堆栈是怎么做的,它似乎使用HttpControllerTypeCache 。 这是一个内部类,所以我不能创建一个实例。 什么是去获得目标控制器类型的正确方法是什么?

Answer 1:

你可以访问类型解析自己使用的全球服务定位器。

var controllerTypeResolver = GlobalConfiguration.Configuration.Services.GetHttpControllerTypeResolver();
var controllerTypes = controllerTypeResolver.GetControllerTypes(GlobalConfiguration.Configuration.Services.GetAssembliesResolver());
var controllerType = controllerTypes.SingleOrDefault(ct => ct.Name == string.Format("{0}Controller", controllerName));

你可能会想要做的结果,一些缓存(如控制器选择呢)。 但是,这种方法应该工作。

你可能会更好移动这个逻辑到自定义过滤器的授权,该控制器,而不是委托处理程序上坐。 鉴于你需要知道控制器的类型,你不妨让ControllerSelector正常工作。 也许,如果你把你的负荷要求的属性为授权行动过滤属性,你可以只加载作为参数传入权利要求和设置本金和索赔那里呢?



Answer 2:

如果您仍然在设定DelegatingHandler你可以得到的控制器选择实例本身,which'll是方式更有效:

var controllerSelector = GlobalConfiguration.Configuration.Services.GetHttpControllerSelector();
var controllerDescriptor = controllerSelector.SelectController( request );


文章来源: Accessing ApiController Type in DelegatingHandler