问题

在 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 方法。

  1. 处理 ASP.NET WEB API Get 请求。
  2. 处理 ASP.NET WEB API Post 请求(因为不使用任何 Http 谓词的话,默认是 Post 请求)。
  3. 使用了 NonActionAttribute 来告诉 ASP.NET WEB API,这个 Controller 中的 public 方法不是 Action。

代码片段 3-21. NonActionAttribute 例子

[水煮 ASP.NET Web API2 方法论](3-7)默认 Action 请求方式以及 NonActionAttribute的更多相关文章

  1. [水煮 ASP.NET Web API2 方法论](3-9)空气路由的设置

    阅读导航 问题 解决方案 工作原理 代码演示 在此解释一下,空气路由,是本人臆想出来,觉着更能表达 IgnoreRoute 的意图,如果看着辣眼睛^^,请见谅. 问题 我们在之定义过集中式路由,集中式 ...

  2. [水煮 ASP.NET Web API2 方法论](1-3)如何接收 HTML 表单请求

    问题 我们想创建一个能够处理 HTML表单的 ASP.NET Web API 应用程序(使用 application/x-www-form-urlencoded 方式提交数据). 解决方案 我们可以创 ...

  3. [水煮 ASP.NET Web API2 方法论](1-5)ASP.NET Web API Scaffolding(模板)

    问题 我们想快速启动一个 ASP.NET Web API 解决方案. 解决方案 APS.NET 模板一开始就支持 ASP.NET Web API.使用模板往我们的项目中添加 Controller,在我 ...

  4. [水煮 ASP.NET Web API2 方法论](3-8)怎样给指定路由配置处理器

    阅读导航 问题 解决方案 工作原理 代码演示 问题 如果仅仅针对指定的路由进行某些特定的消息处理,而不是应用于所有路由,我们应该怎么做呢? 解决方案 ASP.NET WEB API 的很多功能都内建了 ...

  5. [水煮 ASP.NET Web API2 方法论](3-6)万能路由

    问题 定义什么样的路由,可以不会受请求参数类型和数量的限制,而被全部捕获? 解决方案 在路由模板中,给参数添加一个"*"前缀,例如 {*param},只要请求的 URL 能够和路由 ...

  6. [水煮 ASP.NET Web API2 方法论](3-5)路由约束

    问题 怎么样限制路由中参数的值. 解决方案 ASP.NET WEB API 允许我们通过 IHttpRouteConstraint 接口设置路由约束.集中式路由和直接式路由都可以使用 IHttpRou ...

  7. [水煮 ASP.NET Web API2 方法论](3-4)设置路由可选项

    问题 怎么样创建一个路由,不管客户端传不传这个参数,都可以被成功匹配. 解决方案 ASP.NET WEB API 的集中式路由和属性路由都支持路由声明可选参数. 在用集中式路由中可以通过 RouteP ...

  8. [水煮 ASP.NET Web API2 方法论](3-3)路由默认值

    问题 如何为路由中参数设置默认值. 解决方案 不管使用属性路由还是集中式路由,ASP.NET WEB API 都可以很方便的为路由定义默认参数.在每次客户端请求的时候,如果客户端没有传这些参数,框架会 ...

  9. [水煮 ASP.NET Web API2 方法论](3-2)直接式路由/属性路由

    问题 怎么样可以使用更贴近资源(Controller,Action)的方式定义路由. 解决方案 可以使用属性路由直接在资源级别声明路由.只要简单的在 Action 上使用属性路由 RouteAttri ...

随机推荐

  1. C++中new和delete的背后

    关于 C++中new背后的行为, 以前已经写过一篇了 理解C++中new背后的行为, 但是里面也只是泛泛而谈,没有真凭实据, 下面我们从汇编的角度看C++编译器究竟在背后干了什么? 我们的代码很简单, ...

  2. [ZigBee] 11、ZigBee之睡眠定时器二

    1.前言 上一节讲了Zigbee的睡眠定时器利用外部按键使系统从休眠态唤醒到工作态,其核心在于: 61 void SysPowerMode(uchar mode) 62 { 63 if(mode &g ...

  3. .NET在线培训 | C#在线培训 | .NET培训 | 最课程培训

    最课程(www.zuikc.com) 软件开发培训,在线软件培训的创新者!我们的创新在于: 1:一次购买,终身服务.每个最课程学员都会分配一位专职教师及一位监管教师,点对点跟进课程进度,直到您学会课程 ...

  4. 有强迫症的我只能自己写一个json格式化工具

    缘由 为什么博客园的markdown解析出问题了啊?好奇怪啊! 一直以来在编码规范界有2大争论不休的话题,一个是关于是用空格缩进还是tab缩进的问题,一个是花括号是否换行的问题,笔者是tab缩进和花括 ...

  5. Yii CModel中rules验证规则[转]

    array( array(‘username’, ‘required’), array(‘username’, ‘length’, ‘min’=>3, ‘max’=>12), array( ...

  6. 拥抱cnpm

    在国内由于墙的原因,使用NPM安装模块经常会失败,要或在速度上会慢得跟蜗牛一样,这时候我们其实可以选择国内淘宝的NPM镜像,使用下面的命令来进行安装: npm install -g cnpm --re ...

  7. 带你走近AngularJS - 体验指令实例

    带你走近AngularJS系列: 带你走近AngularJS - 基本功能介绍 带你走近AngularJS - 体验指令实例 带你走近AngularJS - 创建自定义指令 ------------- ...

  8. iOS 屏幕适配:autoResizing autoLayout和sizeClass

    1. autoResizing autoresizing是苹果早期的ui布局适配的解决办法,iOS6之前完全可以胜任了,因为苹果手机只有3.5寸的屏幕,在加上手机app很少支持横屏,所以iOS开发者基 ...

  9. css3实现超出文本指定行数(指定文本长度)用省略号代替

    测试代码: <!DOCTYPE html> <html> <head> <meta name="viewport" content=&qu ...

  10. linux安全检查

    1 ssh后门 检察语句: grep -E "user,pas|user:pas" /usr/bin/* /usr/local/sbin/* /usr/local/bin/* /b ...