当前位置: 首页 > 编程语言 > C#

在DelegatingHandler中访问ApiController类型分享

时间:2023-04-11 02:33:33 C#

在DelegatingHandler中访问ApiController类型我在一个项目中使用Asp.NetWebAPI。我目前正在处理身份验证和授权。我有一个messageHandler,它将检查请求的HTTP身份验证标头并构建我的身份和用户配置文件。但是,我想用操作可能需要的声明来注释我的控制器操作(或只是控制器)(我们有很多用户可以拥有的声明,所以我不想加载它们)。例如:publicclassMyController:ApiController{[LoadClaims("SomeClaim","SomeOtherClaim","etc")]publicstringGet(){if(HasClaim("SomeClaim"))return"Awesome";返回“无赖”;在身份验证消息处理程序中,我希望能够查看属性并根据我的需要从数据库中恢复声明。为此,我需要知道我将根据路由点击的控制器和操作:对象控制器名称;对象动作名称;routeData.Values.TryGetValue("controller",outcontrollerName);……所以我可以做到。但是现在我需要把它变成一个我可以反映的类型,但我所拥有的只是控制器名称(甚至不是完整的类名或命名空间)。我怎样才能把它变成我可以反思以获得属性等的东西?我正在查看DefaultHttpControllerSelector以了解WebAPI堆栈是如何做到的,它似乎使用了HttpControllerTypeCache。这是一个内部类,所以我不能创建实例。获取目标控制器类型的正确方法是什么?您可以使用全局服务定位器自己访问类型解析器。varcontrollerTypeResolver=GlobalConfiguration.Configuration.Services.GetHttpControllerTypeResolver();varcontrollerTypes=controllerTypeResolver.GetControllerTypes(GlobalConfiguration.Configuration.Services.GetAssembliesResolver());varcontrollerType=controllerTypes.SingleOrDefault.Forct(Name=>"{0}Controller",controllerName));您可能想要对结果进行一些缓存(就像控制器选择器所做的那样)。但是这个方法应该有效。但是您最好将此逻辑移动到位于控制器而不是委托处理程序中的自定义授权过滤器中。鉴于您需要知道控制器类型,您也可以让ControllerSelector工作。也许,如果您将加载声明属性转换为授权操作过滤器属性,您只需加载作为参数传入的声明并在那里设置正文和声明?如果还是设置在DelegatingHandler上,可以自己获取ControllerSelector实例,效率会更高:以上是C#学习教程:访问DelegatingHandler中的ApiController类型,分享所有内容,如果有用大家需要了解更多C#学习教程,希望大家多多关注——varcontrollerSelector=GlobalConfiguration.Configuration.Services.GetHttpControllerSelector();varcontrollerDescriptor=controllerSelector.SelectController(请求);删除。如需转载请注明出处: