转自:https://www.cnblogs.com/Fengyinyong/p/13721245.html
asp.netcore 路由机制分为 约定路由 和 特性路由。本文采用asp.netcore 3.1来演示。
1.约定路由:一般来说,asp.netcore mvc 多数采用约定路由。
asp.netcore mvc 约定路由配置如下:

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
//提前注入MVC服务
services.AddControllersWithViews();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
//约定路由,需要在 ConfigureServices 方法中提前注入 mvc 服务。
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");// 配置默认的路由地址是 home/index
});
}
}

控制器 代码如下:通过约定路由,根据相应的 Controller 和action ,就可以访问。

public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger<HomeController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
//return Ok(1);
//return this.Ok("123");
//return this.NotFound();
//return this.File(); //返回文件
//return this.Content("这里是返回一段文字");
var st = new Student
{
Id = 1,
FirstName = "Fyy",
LastName = "hehe"
};
/*最终返回到页面的是Json.
返回到页面的具体类型,并不是有Controller决定的。Controller 只是把学生的st,放到了 ObjectResult对象中,
并返回给HTTP请求管道。至于将ObjectResult 以何种形式返回到页面,是由管道的其他环节来处理的。
*/
/*
整个请求的原理:Http请求过来后,经过HTTP请求处理管道,通过路由解析中间件,找到相应的控制器下的Action。Action 处理完逻辑后,
将对象St 装入 ObjectResult对象中,并将其返回给HTTP请求处理管道。管道接收到返回的 ObjectResult之后,
将其写入(转成)HTTP响应并返回给客户端,此时ObjectResult需要决定需要以Json还是XML或其他格式返回给客户端。
*/
return new ObjectResult(st);// 返回json
//return new JsonResult(st);//返回json
//return Json(st);//返回json MVC特有。
//return View();//返回的是Index.CSHTML视图
//return View("Student"); //返回的是Student.cshtml视图。需要注入MVC服务。/ Views / Home1 / Student.cshtml
// / Views / Shared / Student.cshtml
}
public IActionResult Privacy()
{
return View();
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}

2.特性路由:restfull api 或者webapi,通常采用特性路由。
asp.netcore webapi 特性路由配置如下:

public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
//webapi 提前注入控制器服务
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
//需要提前注入控制器服务,才能使用特性路由。
endpoints.MapControllers();
});
}
}

控制器通过加上特性,来配置具体的路由:

[ApiController]
[Route("tt/[action]")] //通过tt/action 就能访问 action为具体的方法。
//[Route("[controller]/[action]")]//通过具体的controller/action 就能访问
//[Route("tt")]//只指定控制的路由,可在具体方法上再指定action的路由
public class MyController:ControllerBase
{
private readonly ILogger<MyController> _logger;
/// <summary>
/// 构造函数注入
/// </summary>
/// <param name="logger"></param>
public MyController(ILogger<MyController> logger)
{
_logger = logger;
}
//[Route("")]//相当于不加任何action路由
//[Route("aa")]
//[Route("[action]")]//不区分大小写
[HttpGet]
public IActionResult GetData()
{
return new ObjectResult(new { name="zhangsan", age=12});
}
}

本文介绍了ASP.NET Core中的两种路由机制——约定路由和特性路由。约定路由通常用于ASP.NET Core MVC,通过配置默认路由`{controller=Home}

1027

被折叠的 条评论
为什么被折叠?



