架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 142|回复: 0

[WebAPI] .net core 的 webapi

[复制链接]
跳转到指定楼层
楼主
发表于 2019-4-16 09:33:57
1、 Controller 继 承 自 和 MVC 一 样 的 Controller ; 路 由 配 置 是 , 在 Controller 上 标 注
[Route("api/[controller]")],在方法上标注[HttpGet]、[HttpPost]等,也可以使用[HttpGet("{id}")]
这 样 的 格 式 。 可 以 使 用 [HttpPost(“Test”)] 这 样 的 方 式 标 注 在 方 法 上 。 这 样 用
http://localhost:54689/api/values/Test 访问。
2、 Action 支持 IActionResult 做返回值,不支持 HttpResponseMessage 做返回值
3、 不再支持 IHttpControllerSelector,用 IApplicationModelConvention 实现多版本
  1. namespace WebApplication32.Controllers.v1
  2. {
  3. public class DefaultController : Controller
  4. {
  5. [HttpGet(nameof(Test))]
  6. public string Test()
  7. {
  8. return "v1";
  9. }
  10. }
  11. }
  12. namespace WebApplication32.Controllers.v2
  13. {
  14. public class DefaultController : Controller
  15. {
  16. [HttpGet(nameof(Test))]
  17. public string Test()
  18. {
  19. return "v2";
  20. }
  21. }
复制代码
编写 NameSpaceVersionRoutingConvention
  1. using System.Linq;
  2. using System.Text.RegularExpressions;
  3. using Microsoft.AspNetCore.Mvc.ApplicationModels;

  4. namespace WebApplication32
  5. {
  6. public class NameSpaceVersionRoutingConvention : IApplicationModelConvention
  7. {
  8. private readonly string apiPrefix;
  9. private const string urlTemplate = "{0}/{1}/{2}";
  10. public NameSpaceVersionRoutingConvention(string apiPrefix = "api")
  11. {
  12. this.apiPrefix = apiPrefix;
  13. }

  14. public void Apply(ApplicationModel application)
  15. {
  16. foreach (var controller in application.Controllers)
  17. {
  18. //如果Controller标注了[Route],则不这个不起作用
  19. var hasRouteAttribute = controller.Selectors
  20. .Any(x => x.AttributeRouteModel != null);
  21. if (hasRouteAttribute)
  22. {
  23. continue;
  24. }
  25. var nameSpaces = controller.ControllerType.Namespace.Split('.');
  26. //获取namespace中版本号部分
  27. var version = nameSpaces.FirstOrDefault(x => Regex.IsMatch(x, @"^v(\d+)$"));
  28. if (string.IsNullOrEmpty(version))
  29. {
  30. continue;
  31. }
  32. string template = string.Format(urlTemplate, apiPrefix, version,
  33. controller.ControllerName);
  34. controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel()
  35. {
  36. Template = template
  37. };
  38. }
  39. }
  40. }
复制代码
  1. using Microsoft.AspNetCore.Mvc.ApplicationModels;
  2. using System.Linq;
  3. using System.Text.RegularExpressions;

  4. namespace CoreWebAPITest1
  5. {
  6. public class NameSpaceVersionRoutingConvention : IApplicationModelConvention
  7. {
  8. private string prefix;

  9. public NameSpaceVersionRoutingConvention(string prefix)
  10. {
  11. this.prefix = prefix;
  12. }

  13. public void Apply(ApplicationModel application)
  14. {
  15. var controllers = application.Controllers;
  16. foreach(var controller in controllers)
  17. {
  18. //判断Controller上是否标注了[Route]
  19. var hasRouteAttribute =
  20. controller.Selectors.Any(s=>s.AttributeRouteModel!=null);
  21. //如果标注了,则不由我处理
  22. if(hasRouteAttribute)
  23. {
  24. continue;
  25. }
  26. var matchVer = Regex.Match(controller.ControllerType.Namespace,
  27. @".v(\d+)");
  28. if(!matchVer.Success)
  29. {
  30. continue;
  31. }
  32. string verNum = matchVer.Groups[1].Value;//1
  33. //计算这个Controller对应的路由路径
  34. string template = this.prefix + "/v" + verNum + "/" + controller.ControllerName;
  35. controller.Selectors[0].AttributeRouteModel = new AttributeRouteModel()
  36. { Template=template};
  37. }
  38. }
  39. }
复制代码
  1. Startup 的 ConfigureServices 中
  2. services.AddMvc(opts=> {
  3. opts.Conventions.Insert(0, new NameSpaceVersionRoutingConvention());
  4. });
复制代码
然后访问 http://localhost:57799/api/v1/Default/Test、http://localhost:57799/api/v2/Default/Test
经 过 调 试 发 现 , NameSpaceVersionRoutingConvention 只 是 在 程 序 启 动 的 时 候 执 行 一 遍 , 不 像
IHttpControllerSeelct 一样,不需要每次请求访问的时候都运行一遍,因此效率更高!
4、 Filter 和 asp.net mvc core 共享,Microsoft.AspNetCore.Mvc.Filters 下有同步异步两种接口。建
议用异步的。然后如下注册
  1. services.AddMvc(opts=> {
  2. opts.Filters.Add(new AuthorFilter());
  3. });
复制代码






上一篇:Vue2.5开发去哪儿网App 从零基础入门到实战项目资源
下一篇:MySQL查询数据库和每个表所占空间大小
帖子永久地址: 

架构师_程序员 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与架构师_程序员享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和架构师_程序员的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、架构师_程序员管理员和版主有权不事先通知发贴者而删除本文

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2019-6-18 13:09

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表