[水煮 ASP.NET Web API2 方法论](3-7)默认 Action 请求方式以及 NonActionAttribute
问题
在 Controller 中有一个 public 的方法,但是又不想将这个 publlic 方法暴露成为一个 API。
解决方案
ASP.NET Web API 中,正常是通过 HTTP 谓词来匹配 Controller 中相关 Action 的。默认情况下,Contoller 中的每个 public 方法都是一个 Action。为了防止 public 的方法成为 Action,只要在 public 的方法上使用 [NonAction] 属性就可以。
工作原理
NoActionAttribute(如代码片段 3-19 所示)是一个非操作类,其中没有做任何事情,只是一个标记。
代码片段 3-19. NonAction 定义
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class NonActionAttribute : Attribute
{
}
ApiControllerActionSeletor,在 Controller 找到合适的 Action 时,内部的验证执行如代码片段 3-10 所示,他将 Controller 中所有的 public 方法都作为潜在的 Action,然后再进行逐步筛选,声明再 ApiController 的会被排除掉,声明再 IHttpController 也会被排除掉,最后,如果使用了 NonActionAttribute 的也会被排除掉。
代码片段 3-20 ApiControllerActionSelector 针对 Action 的过滤规则

注意 这段验证逻辑是在 ApiControllerAtionSelector 内部的,如果自己代码中继承并实现了 IHttpActionSelector,要保证自己的实现中有类似逻辑的代码,才能保证 NonActionAttribute 工作正常。
在 ReflectHttpActionDescriptor 类中 ASP.NET WEB API 会包装每一个 Action,此外,他还负责找出 Action 应该处理 Http 的请求类型。他是通过方法名字或者在方法上使用了相关属性(HttpGetAttribute,HttpPostAttribute,等等)。如果 Action 的名字是以 HTTP 动词(GET,POST,PUT,DELETE)开头的,ASP.NET WEB API 也会认为这 Action 适合处理相关 HTTP 类型的请求。
另外,Action 方法如果任何相关前缀或者声明属性都没有,ASP.NET WEB API 会默认他只能处理 POST 请求。这个是一个很红要,也很容易被忽略的地方。很多初学者会认为,什么前缀或者属性声明也没有,那么,客户端就不可能请求到这个 Action。
代码演示
代码片段 3-21 展示了三个 Action 方法。
- 处理 ASP.NET WEB API Get 请求。
- 处理 ASP.NET WEB API Post 请求(因为不使用任何 Http 谓词的话,默认是 Post 请求)。
- 使用了 NonActionAttribute 来告诉 ASP.NET WEB API,这个 Controller 中的 public 方法不是 Action。
代码片段 3-21. NonActionAttribute 例子

[水煮 ASP.NET Web API2 方法论](3-7)默认 Action 请求方式以及 NonActionAttribute的更多相关文章
- [水煮 ASP.NET Web API2 方法论](3-9)空气路由的设置
阅读导航 问题 解决方案 工作原理 代码演示 在此解释一下,空气路由,是本人臆想出来,觉着更能表达 IgnoreRoute 的意图,如果看着辣眼睛^^,请见谅. 问题 我们在之定义过集中式路由,集中式 ...
- [水煮 ASP.NET Web API2 方法论](1-3)如何接收 HTML 表单请求
问题 我们想创建一个能够处理 HTML表单的 ASP.NET Web API 应用程序(使用 application/x-www-form-urlencoded 方式提交数据). 解决方案 我们可以创 ...
- [水煮 ASP.NET Web API2 方法论](1-5)ASP.NET Web API Scaffolding(模板)
问题 我们想快速启动一个 ASP.NET Web API 解决方案. 解决方案 APS.NET 模板一开始就支持 ASP.NET Web API.使用模板往我们的项目中添加 Controller,在我 ...
- [水煮 ASP.NET Web API2 方法论](3-8)怎样给指定路由配置处理器
阅读导航 问题 解决方案 工作原理 代码演示 问题 如果仅仅针对指定的路由进行某些特定的消息处理,而不是应用于所有路由,我们应该怎么做呢? 解决方案 ASP.NET WEB API 的很多功能都内建了 ...
- [水煮 ASP.NET Web API2 方法论](3-6)万能路由
问题 定义什么样的路由,可以不会受请求参数类型和数量的限制,而被全部捕获? 解决方案 在路由模板中,给参数添加一个"*"前缀,例如 {*param},只要请求的 URL 能够和路由 ...
- [水煮 ASP.NET Web API2 方法论](3-5)路由约束
问题 怎么样限制路由中参数的值. 解决方案 ASP.NET WEB API 允许我们通过 IHttpRouteConstraint 接口设置路由约束.集中式路由和直接式路由都可以使用 IHttpRou ...
- [水煮 ASP.NET Web API2 方法论](3-4)设置路由可选项
问题 怎么样创建一个路由,不管客户端传不传这个参数,都可以被成功匹配. 解决方案 ASP.NET WEB API 的集中式路由和属性路由都支持路由声明可选参数. 在用集中式路由中可以通过 RouteP ...
- [水煮 ASP.NET Web API2 方法论](3-3)路由默认值
问题 如何为路由中参数设置默认值. 解决方案 不管使用属性路由还是集中式路由,ASP.NET WEB API 都可以很方便的为路由定义默认参数.在每次客户端请求的时候,如果客户端没有传这些参数,框架会 ...
- [水煮 ASP.NET Web API2 方法论](3-2)直接式路由/属性路由
问题 怎么样可以使用更贴近资源(Controller,Action)的方式定义路由. 解决方案 可以使用属性路由直接在资源级别声明路由.只要简单的在 Action 上使用属性路由 RouteAttri ...
随机推荐
- [stm32] STM32 Interrupts and events 系统了解(EXTI)及槽型光电开关tp850电路研究
中断和事件 1 嵌套向量中断控制器 特性: ● 68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线):● 16个可编程的优先等级(使用了4位中断优先级):● 低延迟的异常和中断处理:● 电 ...
- Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例
引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...
- Redis教程(十二):服务器管理命令总结
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/140.html 一.概述: Redis在设计之初就被定义为长时间不间断运行 ...
- loglikelihood ratio 相似度
摘要: 在机器学习中常用到各种距离或者相似度,今天在看美团推荐系统重排序的文章时看到了loglikelihood ratio 相似度,特总结起来.以后有时间再把常用的相似度或者距离梳理到一篇文章. 背 ...
- 知方可补不足~用CDC功能来对数据库变更进行捕捉
回到目录 如果我们希望监视一个数据表的变化,在sql2008之前的版本里,在数据库端可能想到的只有触发器,或者在程序端通过监视自己的insert,update,delete来实现相应的功能,这种实现无 ...
- EF架构~充血模型设置不被持久化的属性
回到目录 在Poco实体中,一般只有属性没有方法,这在软件设计中称为贫血模型,而在DDD领域驱动设计中,比较提倡充血模型,即你的Poco实体中,即有属性,也有操作属性的方法,注意这里说的是操作属性的方 ...
- asp.net 站点重启
有时一些特殊情况需要重启站点,在System.Web.dll程序集下HttpRuntime类下有一个静态方法UnloadAppDomain,使用这个方法可以重启站点: protected void b ...
- 《PHP Manual》阅读笔记2
本次笔记截止到 语言参考 流程控制. 1.没有结合的相同优先级的运算符不能连在一起使用,例如 1 < 2 > 1 在PHP是不合法的.但另外一方面表达式 1 <= 1 == 1 是合 ...
- Vue+Webpack+Grunt集成
说明 Vue.Grunt.Webpack的知识请看官方网站 Grunt Tasks:构建.开发调试.打包,命令:grunt build,grunt default,grunt zipall... We ...
- 中小型ERP系统开发与实施
1. 能反映企业管理的各个方面和解决企业实际的问题,不限于一般问题的解决,而是深入企业的业务过程 2. 在此软件的背后有真正的管理思想(不是泛泛而言)和对管理的精髓理解 和归纳,有一个整体的较详细的规 ...