c# - 在 DelegatingHandler 中访问 ApiController 类型

标签 c# asp.net-web-api asp.net-web-api-routing

我正在为一个项目使用 Asp.Net WebAPI。我目前正在研究身份验证和授权。

我有一个 messageHandler,它将检查请求的 HTTP 身份验证 header 并构建我的身份和用户配置文件。但是,我想用操作可能需要的声明来注释我的 Controller 操作(或只是 Controller )(我们有很多用户可以拥有的声明,所以我不想加载它们)。

例如:

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

        return "Bummer";
    }
}

在身份验证消息处理程序中,我希望能够查看属性并仅根据需要从数据库中取回声明。为此,我需要知道我将根据路线点击什么 Controller 和 Action :

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

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

所以我可以得到它。但是现在我需要把它变成一个我可以反射(reflect)的类型,但我所拥有的只是 Controller 名称(甚至不是完整的类名或命名空间)。我怎样才能把它变成我可以反射(reflection)以获得属性等的东西?

我正在研究 DefaultHttpControllerSelector 以了解 WebAPI 堆栈是如何做到的,它似乎使用了 HttpControllerTypeCache。这是一个内部类,所以我无法创建实例。获取目标 Controller 类型的正确方法是什么?

最佳答案

您可以使用全局服务定位器自行访问类型解析器。

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));

您可能想要对结果进行一些缓存(就像 Controller 选择器所做的那样)。但这种方法应该有效。

但是

您最好将此逻辑移动到位于 Controller 而不是委托(delegate)处理程序上的自定义授权过滤器中。如果您需要知道 Controller 类型,您不妨让 ControllerSelector 正常工作。也许,如果您将加载声明属性转换为授权操作过滤器属性,您可以只加载作为参数传入的声明,然后在那里设置主体和声明?

关于c# - 在 DelegatingHandler 中访问 ApiController 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15046073/

相关文章:

c# - MVVM 文本框绑定(bind),从模型更新数据

c# - 如何在 WebApi 请求中获取 Controller 名称?

c# - WEB API 路由错误发现多个操作与具有不同 API 路径的请求相匹配

c# - 在可移植库中使用 CallerMemberName 属性

c# - 在 C# 中生成 HTML 页面 - 最佳实践

c# - 在哪里放置 'logic' 以从人名部分组成全名(在 MVC 应用程序中)

asp.net-web-api - 是否可以 xcopy 部署自托管的 ASP.NET Web API 控制台应用程序?

c# - 无法将字符串转换为 system.Net.HttpContent

asp.net-web-api - WebApi Controller 获取操作不起作用

c# - ASP.NET Web API 操作路由不起作用