[水煮 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 ...
随机推荐
- java生成压缩文件
在工作过程中,需要将一个文件夹生成压缩文件,然后提供给用户下载.所以自己写了一个压缩文件的工具类.该工具类支持单个文件和文件夹压缩.放代码: import java.io.BufferedOutput ...
- 【译】用jQuery 处理XML--浏览器中的XML与JavaScript
用jQuery 处理XML--写在前面的话 用jQuery 处理XML-- DOM(文本对象模型)简介 用jQuery 处理XML--浏览器中的XML与JavaScript 用jQuery 处理XML ...
- js笔记——理解js中的call及apply
call及apply在js里经常碰得到,但一直感觉很陌生,不能熟练使用.怎样才能熟练应用呢? 为什么存在call和apply? 在javascript OOP中,我们经常会这样定义: function ...
- Atitit jsr规范有多少个 407个。Jsr规范大全
Atitit jsr规范有多少个 407个.Jsr规范大全 1.1. JCP维护职能是发展和更新.1 1.2. Java技术规范.参考实现(RI).技术兼容包(TCK)1 1.3. JCP维护的规范 ...
- 使用 flow.ci 实现 Android 自动化测试与持续集成
在上篇文章--如何实现 Android 应用的持续部署中,我们使用的是 flow.ci + Github + fir.im 实现 Android 应用的持续部署.对于 Android 开发者,他们可能 ...
- [javascript]模拟汉诺塔
看了博文自己动手写了代码. 这能值几个钱? 请写代码完成汉诺塔的算法:void Hanoi(int maxLevel); 比如2层汉诺塔,需要打印(Console.WriteLine)出如下文本: A ...
- Liferay7 BPM门户开发之41: Expando API入门
Expando 是liferay的一种自定义表格扩展的方式,从5.0就已存在 , 可以在运行时新建表格\字段\行\值. 这是一种Service Builder之外的轻量级替代扩展方式,不必像Servi ...
- CentOS 下运维自动化 Shell 脚本之 expect
CentOS 下运维自动化 Shell脚本之expect 一.预备知识: 1.在 Terminal 中反斜杠,即 "" 代表转义符,或称逃脱符.("echo -e与pri ...
- web前端攻击详解
前端攻击成因 在web网页的脚本中,有些部分的显示内容会依据外界输入值而发生变化,而如果这些声称html的程序中存在问题,就会滋生名为跨站脚本的安全隐患 XSS跨站脚本攻击: 英文全称cross-si ...
- KendoUI系列:AutoComplete
1.基本使用 <link href="@Url.Content("~/C ontent/kendo/2014.1.318/kendo.common.min.css" ...