[水煮 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 ...
随机推荐
- Node.js使用fs.renameSync报cross-device link not permitted错误
在Node.js中,我们可以使用formidable模块来轻松地实现文件上传功能,代码如下: var Q = require('q'); var util = require('util'); var ...
- HQL查询语言——转载(http://www.cnblogs.com/20gg-com/p/6045739.html)
Hibernate查询语言(HQL)是一种面向对象的查询语言,类似于SQL,但不是对表和列操作,HQL适用于持久对象和它们的属性. HQL查询由Hibernate转换成传统的SQL查询,这在圈上的数据 ...
- Masonry -- 使用纯代码进行iOS应用的autolayout自适应布局
简介 简化iOS应用使用纯代码机型自适应布局的工作,使用一种简洁高效的语法替代NSLayoutConstraints. 项目主页: Masonry 最新示例: 点击下载 项目简议: 如果再看到关于纯代 ...
- sql分组(orderBy、GroupBy)获取每组前一(几)条数据
sql数据库实现分组并取每组的前1(几)条数据 测试数据准备工作: 根据某一个字段分组取最大(小)值所在行的数据: 创建表并且插入数据 ),Val )) , 'a1--a的第一个值') , 'b2b2 ...
- 学习ASP.NET MVC(七)——我的第一个ASP.NET MVC 查询页面
在本篇文章中,我将添加一个新的查询页面(SearchIndex),可以按书籍的种类或名称来进行查询.这个新页面的网址是http://localhost:36878/Book/ SearchIndex. ...
- 利用@property实现可控的属性操作
利用@property实现可控的属性操作 Python中没有访问控制符, 不像java之类的 public class Person{ private int x public int getAge( ...
- 静态(static)代码块、构造代码块、构造函数、父类子类执行顺序
静态代码块:static修饰的代码块. 在类加载-初始化的时候进行,主要目的是给变量赋予初始值 构造代码块:直接在类中定义且没有加static关键字的代码块称为构造代码块. java会把构造代码块放到 ...
- java基础,继承类题目:编写一个Java应用程序,该程序包括3个类:Monkey类、People类和主类 E
21.编写一个Java应用程序,该程序包括3个类:Monkey类.People类和主类 E.要求: (1) Monkey类中有个构造方法:Monkey (String s),并且有个public vo ...
- JSON学习之二
1.JSON语法是JavaScript对象表示法的子集,语法规则: **数据在名称/值对中 **数据由逗号分隔 **花括号保存对象 **方括号保存数组 2.JSON名称/值对:JSON数据的书写格式是 ...
- python中paramiko模块的使用
paramiko是python一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接1.可以远程操作服务器文件 例如: df:查看磁盘使用情况 mkdir:创建目录 mv/cp/mk ...