原文链接 :https://stormpath.com/blog/routing-in-asp-net-core

在ASP.NET Core中构建路由的5种方法

by Team Stormpath | August 17, 2016 |

在软件开发中,路由用于将所有传入请求映射到处理程序,并生成响应中使用的URL。在ASP.NET Core中,路由已经从根本上重写了。以前,使用MVC和Web API进行路由非常相似,但两者都使用不同的框架(和代码)来执行相同的操作。一个重要的区别是Web API默认支持RESTful路由。例如,如果一个控制器的操作方法名称开头Post,那么调用一个HTTP Post默认情况下会调用该方法。

由于微软决定重建和统一路由框架,现在适用于MVC,也适用于Web API。然而,在我们深入了解如何构建路由之前,让我们回顾一下为什么路由对您的应用程序非常重要。

为什么路由?

SEO友好

REST式配置的路由有助于您的内容的搜索引擎优化(SEO)。网站的网址是影响网站排名的首要标准之一。通过将www.yourwebsite.com/articles/show/123转换为www.yourwebsite.com/how-to-peel-potatoes,您鼓励搜索引擎对与“how to peel potatoes.”有关的关键语句进行排名。

此外,如果您的网址具有更强的描述性,则用户可以更轻松地预测内容,从而增加页面上的时间,这也会影响SEO和整体页面权限。

网址不需要映射文件

没有路由,传入的请求将被映射到物理文件。通过路由,我们可以完全控制请求,使我们能够决定在某个HTTP请求进入时我们执行的操作和控制器。

长URL和文件扩展名可以省略

在许多参数和过滤器都在使用的情况下,路由有助于缩短URL。通过消除文件扩展名,我们可以隐藏我们正在工作的环境。

那么,我们如何利用这些好处呢?让我们看看您可以在ASP.NET Core应用程序中构建路由的五种方法。

1.创建默认路由

您可以按照惯例在您的项目Startup类中定义默认路由。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

public class Startup

{

public void ConfigureServices(IServiceCollection services)

{

services.AddMvc();

}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

{

app.UseMvc(routes =>

{

routes.MapRoute(

name: "default",

template: "  {controller=Home}/{action=Index}/{id?}");

});

}

}

通过以上,我们确保我们项目中的基本配置存在于Controller + Action + ID(可选)路径的标准MVC模式中。你也可以像这样声明路由模式:

 

1

2

3

4

5

6

routes.MapRoute(

name: "default_route",

template: "{controller}/{action}/{id?}",

defaults: new { controller = "Home", action = "Index" }

);

(这是我们用来在ASP.NET Core中进行路由的方式。)

2.扩展默认路由

一旦我们配置了默认路由,我们可能希望通过根据特定需求添加自定义路由来扩展它。为此,我们可以使用该MapRoute()方法添加配置。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

app.UseMvc(routes =>

{

//New Route

routes.MapRoute(

name: "about-route",

template: "about",

defaults: new { controller = "Home", action = "About" }

);

routes.MapRoute(

name: "default",

template: "{controller=Home}/{action=Index}/{id?}");

});

我们添加了一条额外的路线,通过路线授予对主控制器上“关于”操作的访问权限/about。由于默认模式路由仍然存在,因此我们也可以使用常规/home/about路由访问“关于”页面。

3.使用属性

您还可以使用控制器中的属性和操作来配置路由。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

[Route("[controller]")]

public class AnalyticsController : Controller

{

[Route("Dashboard")]

public IActionResult Index()

{

return View();

}

[Route("[action]")]

public IActionResult Charts()

{

return View();

}

}

在本示例中,我们可以通过以下路径访问控制器操作:

  • /Analytics/Dashboard

  • /Analytics/Charts

您可以看到这两个标记,[controller]并[action]指出我们必须引用已声明的控制器和操作名称。在这种情况下,“Analytics”是控制器的名称,“Charts”是动作的名称,因此它是路由的名称。

4.构建RESTful路线

为了声明一个RESTful控制器,我们需要使用以下路由配置:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

[Route("api/[controller]")]

public class ValuesController : Controller

{

// GET api/values

[HttpGet]

public IEnumerable<string> Get()

{

return new string[] {"hello", "world!"};

}

// POST api/values

[HttpPost]

public void PostCreate([FromBody] string value)

{

}

}

在这里,我们告诉我们的RESTful服务接受/api/values路由下的呼叫。请注意,我们不再使用该Route属性进行操作。相反,我们与装饰它HttpGet,HttpPost,HttpPut,HttpDelete的属性。 
或者,我们可以看看不同的场景:

 

1

2

3

4

5

6

// POST api/values/5

[HttpPost("{id}")]

public void PostUpdate(int id, [FromBody] string value)

{

}

在这里,我们有以下路线的控制器值

  • HTTP Post的/values路线将调用Post()行动

  • HTTP Post的/values/PostName路线将调用Post([FromBody]string value)行动

5.使用约束

我们可以将使用约束传递给动作的值的类型进行限制。例如,如果我们期望一个参数是一个数字,我们必须将其限制为整数类型。使用大括号在属性中声明约束{id:int}。

 

1

2

3

4

5

6

[HttpGet("{id:int}")]

public string GetById(int id)

{

return "item " + id;

}

在这里,我们告诉动作GetByID只接受一个整数参数。向约束添加问号{id:int?}表示该参数是可选的。因此,如果有问号,我们可以打电话/GetByID/123或/GetByID不带附加参数。我们也可以这样定义在Startup类中声明的默认路由中的约束:

 

1

2

3

4

5

routes.MapRoute(

name: "getProductById",

template: "Products/{id:int}",

defaults: new { controller = "Products", action = "GetById" });

在ASP.NET Core中构建路由的5种方法的更多相关文章

  1. C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法

    C#调用接口注意要点   在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...

  2. ASP.Net Core中处理异常的几种方法

    本文将介绍在ASP.Net Core中处理异常的几种方法 1使用开发人员异常页面(The developer exception page) 2配置HTTP错误代码页 Configuring stat ...

  3. 如何在 ASP.NET Core 中构建轻量级服务

    在 ASP.NET Core 中处理 Web 应用程序时,我们可能经常希望构建轻量级服务,也就是没有模板或控制器类的服务. 轻量级服务可以降低资源消耗,而且能够提高性能.我们可以在 Startup 或 ...

  4. ASP.NET Core中自定义路由约束

    路由约束 ASP.NET Core中,通过定义路由模板,可以在Url上传递变量,同时可以针对变量提供默认值.可选和约束. 约束的使用方法是在属性路由上添加指定的约束名,用法如下: // 单个使用 [R ...

  5. ASP.NET Core中app.UseDeveloperExceptionPage和app.UseExceptionHandler方法有什么用

    在新建一个ASP.NET Core项目后,在项目Startup类的Configure方法中默认会添加两个方法的调用,app.UseDeveloperExceptionPage和app.UseExcep ...

  6. ASP.NET Core 释放 IDisposable 对象的四种方法

    本文翻译自<Four ways to dispose IDisposables in ASP.NET Core>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! IDispos ...

  7. 如何在asp.net mvc中添加自定义的HTML辅助种方法

    很久没在博客园发表文章了,今天来总结一下如何在asp.net mvc中添加自定义的HTML辅助方法.我们现在设计这么一个目前,利用自定义的HTML方法来渲染一个普通的img标记.直接进入主题吧: 首先 ...

  8. asp.net core 中的路由

  9. 如何在ASP.NET Core 中快速构建PDF文档

    比如我们需要ASP.NET Core 中需要通过PDF来进行某些简单的报表开发,随着这并不难,但还是会手忙脚乱的去搜索一些资料,那么恭喜您,这篇帖子会帮助到您,我们就不会再去浪费一些宝贵的时间. 在本 ...

随机推荐

  1. window10 hello 人脸识别无法启动相机的问题

    win10设置人脸识别的时候无法打开相机.但是在qq,其他软件中可以调用相机,可以打开相机的时候.windows hello 就是打不开,不知道怎么回事. 尝试打开电源选项,有一个   选项,还原一下 ...

  2. 一文带你了解 Spring 5.0 WebFlux 应用场景

    一.什么是 Spring WebFlux 下图截自 Spring Boot 官方网站: 结合上图,在了解 Spring WebFlux 之前,我们先来对比说说什么是 Spring MVC,这更有益我们 ...

  3. HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP

    题图:by @Olga Hi,大家好,我是承香墨影! HTTP 协议在网络知识中占据了重要的地位,HTTP 协议最基础的就是请求和响应的报文,而报文又是由报文头(Header)和实体组成.大多数 HT ...

  4. 【推荐】 HyperLedger Fabric环境搭建、测试及注意事项 [详尽指导] [亲测有效]

    系统:Ubuntu16.04 LTS 一.环境准备 1.1 Ubuntu下安装 crul sudo apt install curl curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被 ...

  5. 创建一个 Spring Boot 项目,你会几种方法?

    我最早是 2016 年底开始写 Spring Boot 相关的博客,当时使用的版本还是 1.4.x ,文章发表在 CSDN 上,阅读量最大的一篇有 42W+,如下图: 2017 年由于种种原因,就没有 ...

  6. [翻译 EF Core in Action 2.2] 创建应用程序的数据库上下文

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  7. c#根据路径(url)下载图片

    方法一:根据路径下载图片 1 /// <summary> /// 图片另存为 /// </summary> /// <param name="url" ...

  8. python 简史

    ---恢复内容开始--- Python的作者,Guido von Rossum,确实是荷兰人.1982年,Guido从阿姆斯特丹大学(University of Amsterdam)获得了数学和计算机 ...

  9. python3 购物车

    今天干了啥?喂了喂龟,看了看鱼... 然后就是学习了两个模块:sys模块和os模块,突然觉得python真的好,只要英语学的好,看代码超级舒服的说,嗯,我要好好学英语,今天背了几个啥,唉.写完博客再背 ...

  10. Ambari安装及自定义service初步实现

    Ambari安装 1 Ambari简介 Apache Ambari项目的目的是通过开发软件来配置.监控和管理hadoop集群,以使hadoop的管理更加简单.同时,ambari也提供了一个基于它自身R ...