在开始今天的吹牛节目之前,老周先说个破事:每周的周五或者周六,老周会在新浪直播平台(一直播同步)开播 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的更多相关文章

  1. asp.net core 2.2 中的过滤器/筛选器(上)

    ASP.NET Core中的过滤器/筛选器 通过使用 ASP.NET Core MVC 中的筛选器,可在请求处理管道中的特定阶段之前或之后运行代码. 注意:本主题不适用于 Razor 页面. ASP. ...

  2. ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)

    ASP.NET MVC 一.获取URL(ASP.NET通用): [1]获取完整url(协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [ ...

  3. asp.net Core 2.0 MVC为Controller或Action添加定制特性实现登录验证

    前言:最近在倒腾 微软的新平台 asp.net Core 2.0,在这个过程中有些东西还是存在差异.下面是我在学习过程的一点笔记.有不妥之处,望各位大虾指正! 一.先创建一个控制器继承于Control ...

  4. ASP.Net Core 里是如何把一个普通的 Action 返回类型转换为某种 IActionResult 的

    秘密在于这个类型: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker 在它的 CreateActionResult 方法里会将相关类型 ...

  5. 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 ...

  6. ASP.NET CORE 基础知识(一):概述【下】

    此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译.其中或许会添加本人对 ASP.NET Core 的浅显理解 配置 ASP.NET Core提供了一个配置框架,其能够从 ...

  7. Asp.Net Core EndPoint 终点路由工作原理解读

    一.背景 在本打算写一篇关于Identityserver4 的文章时候,确发现自己对EndPoint -终结点路由还不是很了解,故暂时先放弃了IdentityServer4 的研究和编写:所以才产生了 ...

  8. 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 ...

  9. Asp.Net Core 中获取应用程序物理路径(Getting the Web Root Path and the Content Root Path in ASP.NET Core)

    如果要得到传统的ASP.Net应用程序中的相对路径或虚拟路径对应的服务器物理路径,只需要使用使用Server.MapPath()方法来取得Asp.Net根目录的物理路径,如下所示: // Classi ...

随机推荐

  1. ES6中let和闭包

    在开始本文之前我们先来看一段代码 for(var i=0;i<10;i++){ arr[i]=function(){ return i; } } console.log(arr[3]());// ...

  2. flex 布局 input 宽度不自适应

    flex 布局 input 宽度不自适应 解决方法: 给 input 加上min-height 解决!

  3. c中const定义的问题

    /* 这题有个疑问: const double BASE1=BREAK1*RATE1; //第二个分界点前总共要缴的税收 const double BASE2=BASE1+(BREAK2-BREAK1 ...

  4. ie 浏览器文本输入框和密码输入框的默认样式

    登录页在ie浏览器上的默认样式 输入框后面的X    密码框后面的眼睛 如下图 解决方案 /*ie文本框背景色*/ input::-ms-clear { display: none; } /*ie文本 ...

  5. centos安装软件依赖问题

    yum install gcc gcc-c++ ncurses-devel perl 基础包安装

  6. python requests库学习笔记(下)

    1.请求异常处理 请求异常类型: 请求超时处理(timeout): 实现代码: import requestsfrom requests import exceptions        #引入exc ...

  7. spring core 与 context理解

    Spring core是核心层,拥有这BeanFactory这个强大的工厂,是所有bean的管理器: 而spring context是上下文运行环境,基于spring core之上的一个架构, 它之上 ...

  8. AGC010 - B: Boxes

    原题链接 题意简述 给出一个由个数构成的环,每次可以选择一个位置并从这个数起顺时针依次对每个数-1,-2,-3,-,-n.问能否将所有数全变为0. 分析 考虑一次操作对环带来了什么影响. (在后加一个 ...

  9. R语言数据框中,用0替代NA缺失值

    1.用0替代数据框中的缺失值NA 生成数据框: > m <- matrix(sample(c(NA, :), , replace = TRUE), ) > d <- as.da ...

  10. Ironic几种不同的场景下的网络拓扑

    最近帮领导做了几页ppt,总结几种场景下ironic管理物理机网络的网络拓扑,简单做成一份文章记录下.只是方便自己记忆,没有认真修改.如果对ironic有一定了解,可以看下,加深理解. 1. vlan ...