【ASP.NET Core】根据 Content-Type 头部来筛选 Action
在开始今天的吹牛节目之前,老周先说个破事:每周的周五或者周六,老周会在新浪直播平台(一直播同步)开播 ASP.NET Core 相关的内容。具体的直播时间老周会在微博上发布。直播是免费观看的,当然了,如果你钱多的话,也可以赞助老周几个欧元的。
好,进入今天的主题。留个悬念,老周不告诉你扯什么,先看一个例子。
[Route("/api/[controller]/[action]")]
public class DemoController : Controller
{
[ActionName("send"), HttpGet]
public IActionResult Send_Ver1()
{
return Content("你访问的是版本 1 的接口,此接口提供给畜生使用。");
}
[ActionName("send")]
[HttpGet]
public IActionResult Send_Ver2()
{
return Content("你访问的是版本 2 的接口,该接口提供给人渣使用。");
}
}
这是一个控制器类,因为没有 View 返回,也可以认为是一个 Web API。
关键注意这两个 Attribute。
ActionName("send")
ActionName("send")
类中有两个方法,分别命名为 Send_Ver1 和 Send_Ver2,由于我在它们上面使用了 ActionNameAttribute,并且指定了这两个方法所公开的 Action 名字都叫 send。
如此一来,疑问就产生了,两个同名的 action ,应用程序在运行阶段该如何选择呢。
来,试试看。

电脑毕竟不是人脑,它不会思考的,所以,运行的时候应用程序是无法做出选择了。
一般真的开发的话,没有人这么干的,弄两个一样的 action 干屌,不过,为了接下来的演示,老周决定干一次屌。这个时如果你非得坚持使用两个同名 action ,那么,你可以通过客户端调用时传递的 content-type Header 来区别这两个 action。
于是,你可以对上面的代码做这样修改,应用一个 ConsumesAttribute 就好了,当然了,重点是你得指定 Content-Type。
[Route("/api/[controller]/[action]")]
public class DemoController : Controller
{
[ActionName("send"), HttpGet]
[Consumes("application/pdf")]
public IActionResult Send_Ver1()
{
……
}
[ActionName("send")]
[HttpGet]
[Consumes("audio/DV")]
public IActionResult Send_Ver2()
{
……
}
}
这样改动之后,在发起请求时,如果指定 content-type 为 application/pdf,那么调用会进入 Send_Ver1 方法;如果请求时指定的 content-type 是 audio/DV,那么就会进入 Send_Ver2 方法。
这个 ConsumesAttribute 在实例化时,还可以指定多个 content-type。因为它有这样的构造函数。
public ConsumesAttribute(string contentType, params string[] otherContentTypes)
比如咱们这个示例,如果希望带 application/PDF 和 application/XML 的 Content-Type 都能进入 Send_Ver1 方法,那么你可以这么做。
[Consumes("application/pdf", "application/xml")]
public IActionResult Send_Ver1()
{
……
}
现在咱们再来测试一下。
第一步,携带 content-type = application/pdf 调用 web api。

第二步,把 Content-Type 改为 audio/DV,再发起一次请求。

第三步,把 Content-Type 改为 application/xml ,再试试。

因为上面咱们指定了,application/pdf 和 application/xml 的 content type 都可以进入 Send_Ver1 方法,所以,第一步与第三步测试的结果相同。
好了,今天的吹牛节目完成了,下次老周与你继续扯。
【ASP.NET Core】根据 Content-Type 头部来筛选 Action的更多相关文章
- asp.net core 2.2 中的过滤器/筛选器(上)
ASP.NET Core中的过滤器/筛选器 通过使用 ASP.NET Core MVC 中的筛选器,可在请求处理管道中的特定阶段之前或之后运行代码. 注意:本主题不适用于 Razor 页面. ASP. ...
- ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)
ASP.NET MVC 一.获取URL(ASP.NET通用): [1]获取完整url(协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [ ...
- asp.net Core 2.0 MVC为Controller或Action添加定制特性实现登录验证
前言:最近在倒腾 微软的新平台 asp.net Core 2.0,在这个过程中有些东西还是存在差异.下面是我在学习过程的一点笔记.有不妥之处,望各位大虾指正! 一.先创建一个控制器继承于Control ...
- ASP.Net Core 里是如何把一个普通的 Action 返回类型转换为某种 IActionResult 的
秘密在于这个类型: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker 在它的 CreateActionResult 方法里会将相关类型 ...
- Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 排序、筛选、分页以及分组
Sorting, filtering, paging, and grouping 7 of 8 people found this helpful By Tom Dykstra The Contoso ...
- ASP.NET CORE 基础知识(一):概述【下】
此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译.其中或许会添加本人对 ASP.NET Core 的浅显理解 配置 ASP.NET Core提供了一个配置框架,其能够从 ...
- Asp.Net Core EndPoint 终点路由工作原理解读
一.背景 在本打算写一篇关于Identityserver4 的文章时候,确发现自己对EndPoint -终结点路由还不是很了解,故暂时先放弃了IdentityServer4 的研究和编写:所以才产生了 ...
- asp.net core 3.0 JObject The collection type 'Newtonsoft.Json.Linq.JObject' is not supported
在asp.net core 3.0 中,如果直接在Controller中返回 Jobject 类型,会抛出如下错误: The collection type 'Newtonsoft.Json.Linq ...
- Asp.Net Core 中获取应用程序物理路径(Getting the Web Root Path and the Content Root Path in ASP.NET Core)
如果要得到传统的ASP.Net应用程序中的相对路径或虚拟路径对应的服务器物理路径,只需要使用使用Server.MapPath()方法来取得Asp.Net根目录的物理路径,如下所示: // Classi ...
随机推荐
- linux内核链表的使用
linux内核链表:链表通常包括两个域:数据域和指针域.struct list_head{struct list_head *next,*prev;};include/linux/list.h中实现了 ...
- 搭建SS服务器
体验: http://ss.ishadowx.com/ centos7 安装shadowsocks客户端 http://blog.csdn.net/guyan0319/article/details/ ...
- nginx的location优先级
在nginx配置文件中,location主要有这几种形式: 1. 正则匹配 location ~ /abc { } 2. 不区分大小写的正则匹配 location ~* /abc { } 3. 匹配路 ...
- go语言实现无限极分类
// 应用分类二级菜单 AppCateNode struct { Id int64 `json:"id"` Name string `js ...
- javascript函数大全
JavaScript函数大全 1.document.write(""); 输出语句2.JS中的注释为//3.传统的HTML文档顺序是:document->html->( ...
- C# 使用AngleSharp 爬虫图片
AngleSharp 简介 AngleSharp是基于.NET(C#)开发的专门解析HTML源码的DLL组件.根据HTML的DOM结构操作HTML,整个DOM已传输到逻辑类结构中.这种结构可以更好的操 ...
- iptables转发备忘
iptables -F sysctl net.ipv4.ip_forward=1 iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8766 - ...
- Yii2 日志处理
最近开发一个新的PHP项目,终于脱离了某框架的魔爪(之前被折磨的不轻),选用了江湖中如雷贯耳的Yii2框架.每个项目代码的运行,日志是必不可少的,在开发中踩了一遍Yii2日志管理的坑,看过很多网上对Y ...
- C语言_了解一下C语言中的四种存储类别
C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. C语言中的四种存储类别:auto ...
- 老男孩Python全栈开发(92天全)视频教程 自学笔记18
day18课程内容: os模块 import osprint(os.getcwd())#D:\untitled\练习题 获取当前工作目录os.chdir(r'D:\untitled\练习题\16.1切 ...