在ASPNETCORE中获得所有Action

本文旨在记录自己在aspnetcore工作中需要获取所有Action,在查询了资料后进行了几种方法的记录。后期有发现其它方式再进行追加。

一、通过 反射 查看

(该方法过于常见,此处略)

二、通过 ApplicationPartManager 查看

  1. 通过构造函数注入ApplicationPartManager
  2. 通过 PopulateFeature() 方法将数据设置到ControllerFeature实例中;

public class ListController : Controller
{
public ListController(ApplicationPartManager applicationPartManager)
{
_applicationPartManager = applicationPartManager;
}
private ApplicationPartManager _applicationPartManager; public IEnumerable<dynamic> List()
{
var controllerFeature = new ControllerFeature();
_applicationPartManager.PopulateFeature(controllerFeature);
var data = controllerFeature.Controllers.Select(x => new
{
Namespace = x.Namespace,
Controller = x.FullName,
ModuleName = x.Module.Name,
Actions = x.DeclaredMethods.Where(m=>m.IsPublic && !m.IsDefined(typeof(NonActionAttribute))).Select(y => new
{
Name = y.Name,
ParameterCount = y.GetParameters().Length,
Parameters = y.GetParameters()
.Select(z => new
{
z.Name,
z.ParameterType.FullName,
z.Position,
Attrs = z.CustomAttributes.Select(m => new
{
FullName = m.AttributeType.FullName,
})
})
}),
});
return data;
}
}

方法优缺点:

  • 优点:

使用方便;

能直接获取所有注册的Controller;

  • 缺点:

不能获取action信息;

不能方便的获取路由信息;

三、通过 IActionDescriptorCollectionProvider 查看

  1. 通过构造函数注入IActionDescriptorCollectionProvider 实例;

private IActionDescriptorCollectionProvider _actionProvider; public IEnumerable<dynamic> List()
{
var actionDescs = _actionProvider.ActionDescriptors.Items.Cast<ControllerActionDescriptor>().Select(x => new
{
ControllerName = x.ControllerName,
ActionName = x.ActionName,
DisplayName = x.DisplayName,
RouteTemplate = x.AttributeRouteInfo.Template,
Attributes = x.MethodInfo.CustomAttributes.Select(z=>new {
TypeName = z.AttributeType.FullName,
ConstructorArgs = z.ConstructorArguments.Select(v => new {
ArgumentValue = v.Value
}),
NamedArguments = z.NamedArguments.Select(v => new {
v.MemberName,
TypedValue = v.TypedValue.Value,
}),
}),
ActionId = x.Id,
x.RouteValues,
Parameters = x.Parameters.Select(z => new {
z.Name,
TypeName = z.ParameterType.Name,
})
}); return actionDescs;
}

方法优缺点

  • 优点:

能快速查看所有的acton详细信息及其路由信息,包括参数信息,特性等等;

  • 缺点:

不能方便得查看Controller的信息;

在ASPNETCORE中获得所有Action的更多相关文章

  1. ASP.NET Core MVC中Controller的Action如何直接使用Response.Body的Stream流输出数据

    在ASP.NET Core MVC中,我们有时候需要在Controller的Action中直接输出数据到Response.Body这个Stream流中,例如如果我们要输出一个很大的文件到客户端浏览器让 ...

  2. MVC 5 中Filter控制 action的访问权限

    1,创建一个继承自 FilterAttribute, IActionFilter的类 namespace HeatMetering2.Filters { public class HMV2Authen ...

  3. jquery中ajax向action传递对象参数,json ,spring注入对象

    首先,我这个程序的框架是spring+struts2+hibernate. 后端的action的需要接受从前端传进来的参数,由spring的注入,可知,如果前端用的是form的话,只需要在每个inpu ...

  4. 在AspNetCore 中 使用Redis实现分布式缓存

    AspNetCore 使用Redis实现分布式缓存 上一篇讲到了,Core的内置缓存:IMemoryCache,以及缓存的基础概念.本篇会进行一些概念上的补充. 本篇我们记录的内容是怎么在Core中使 ...

  5. AspNetCore中使用Ocelot之 IdentityServer4(1)

    AspNetCore中使用Ocelot之 IdentityServer4(1) 前言: OceLot网关是基于AspNetCore 产生的可扩展的高性能的企业级Api网关,目前已经基于2.0 升级版本 ...

  6. loadrunner 技巧-模拟Run Logic中的随机Action运行

    技巧-模拟Run Logic中的随机Action运行 by:授客 QQ:1033553122   可以这样做,Run-time Settings,删除Action7,然后在其它Action比如Acti ...

  7. ASP.NET Core MVC中Controller的Action,默认既支持HttpGet,又支持HttpPost

    我们知道ASP.NET Core MVC中Controller的Action上可以声明HttpGet和HttpPost特性标签,来限制可以访问Action的Http请求类型(GET.POST等). 那 ...

  8. struts2中<welcome-file>index.action</welcome-file>直接设置action,404的解决方案

    这几天的项目页面的访问全部改为.action访问,在修改首页时遇到了问题.将web.xml文件中<welcome-file>index.action</welcome-file> ...

  9. Struts1中actionform和action属于MVC哪一层,为什么?

    Struts1中actionform和action属于MVC哪一层,为什么? 解答:actionform和action属于MVC的Model层,Action用来处理业务逻辑,actionform保存用 ...

随机推荐

  1. unable browse url when InfoPath Convert to Connection File

    You must actived the windows feature "Desktop Experience" on the server : http://blogs.tec ...

  2. mongodb高版本与低版本的区别

    mongodb高版本与低版本的区别 一.mongodb引擎: Mongodb 3.0支持用户自定义存储引擎,用户可配置使用mmapv1或者wiredTiger存储引擎. 3.2版本以后默认的开启的是w ...

  3. linux命令之系统管理命令(上)

    1.lsof:查看进程打开的文件 该命令可以列举系统中已经被打开的文件,可以根据文件找到对应的进程信息,同时也可以根据进程信息找到进程打开的文件. 参数 说明 -c 进程名 显示指定的进程名打开的文件 ...

  4. “全栈2019”Java第四十五章:super关键字

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. Hibernate根据方言dialect动态连接多数据库

    Hibernate根据方言dialect动态连接多数据库 由于最近需要在web项目中动态链接不同地址的数据库,且要链接的子数据库的信息在总数据库(即web项目的主数据库)的表中,所以动手写了一个类. ...

  6. 读优&&输优

    很nb的技巧……但奇怪的是只能对文件使用…… 然而交到OJ上或者比赛的时候都没有关系→_→ 我大概也只能弄弄这些花里胡哨的东西了→_→ 原理不清楚,背个板子好了 //minamoto #include ...

  7. [ActionScript 3.0] 获取TextFiled字符边框

    /***** * getCharBoundaries () 方法 :返回一个矩形,该矩形是字符的边框. * getCharIndexAtPoint() 方法基于鼠标单击的 localX 和 local ...

  8. codis__使用注意事项

    codis 不支持批量的命令, codis对 redis-server 的最低版本要求是 2.8.13

  9. 51nod1847 奇怪的数学题 (Min_25筛+第二类斯特林数)

    link \(\sum_{i=1}^n\sum_{j=1}^n\mathrm{sgcd}(i,j)^k=\sum_{p=1}^ns(p)^k\sum_{i=1}^n\sum_{j=1}^n[\gcd( ...

  10. virsh 连接虚拟机 (vnc 或 控制台)

    第一种方式 1.如果虚拟机登录方式为VNC,在ubuntu机器上安装vncviewer 在虚拟机的配置xml中 <graphics type="vnc" autoport=& ...