我正在为一个项目使用 Asp.Net WebAPI。我目前正在研究身份验证和授权。
我有一个 messageHandler 将检查请求的 HTTP 身份验证标头并构建我的身份和用户配置文件。但是,我想用该操作可能需要的声明来注释我的控制器操作(或只是控制器)(我们有很多用户可以拥有的声明,所以我不想全部加载它们)。
例如:
public class MyController : ApiController
{
[LoadClaims("SomeClaim", "SomeOtherClaim", "etc")]
public string Get()
{
if (HasClaim("SomeClaim"))
return "Awesome";
return "Bummer";
}
}
在身份验证消息处理程序中,我希望能够查看属性并仅根据需要从数据库中取回声明。为此,我需要知道我将根据路由点击什么控制器和操作:
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
. 这是一个内部类,所以我无法创建实例。获取目标控制器类型的正确方法是什么?