路由:
web的请求到达后端服务时,controller(控制器)会处理传入的http请求并响应用户操作,请求的url会被映射到控制器的操作方法上。
此映射过程由应用程序中定义的路由规则完成。
ASP.NET.Core MVC中的路由
路由使用一对由UseRouting和UseEndPoints注册的中间件:
UseRouting向中间件管道添加路由匹配。此中间件会查看应用中定义的终结点集,并根据请求选择最佳匹配
UseEndpoints向中间件管道添加终结点执行。
asp.net.core有两种路由技术:常规路由和属性路由
常规路由:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseStaticFiles();app.UseMvcWithDefaultRoute();
}
默认路由模板{controller=Home}/{action = Index}/{id?}
,大多数的URL都会按照这个规则进行映射。问号表示 id 参数可有可无。
如果要定义自己的路径模板,要使用 UseMvc()方法,而不是 UseMvcWithDefaultRoute()方法。
app.UseMvc(routes =>
{routes.MapRoute("default","{controller=Home}/{action = Index}/{id?}");
});
//1、启用默认路由
app.UseStaticFiles();
app.UseRouting();
app.UseMvcWithDefaultRoute();//2、自定义路由模板
app.UseStaticFiles();
app.UseRouting();
app.UseMvc(routes =>
{routes.MapRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}");
});//3、使用UseEndpoints自定义路由模板
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{endpoints.MapControllerRoute(name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");});
属性路由:
使用属性路由,可以在Controller或 Controller 的操作方法上应用Route属性。
在Startp.cs文件Configure方法中,我们只使用app.UseMvc();然后在Controller的Action方法上通过特性Route来配置。
[Route("[controller]/[action]")]public class HomeController : Controller{private readonly IStudentRepository _studentRepository;//构造函数注入public HomeController(IStudentRepository studentRepository){_studentRepository = studentRepository;}[Route("")][Route("~/")] //解决 http://localhost:44338/ 访问不了问题[Route("~/home")] //解决 http://localhost:44338/home 访问不了问题public IActionResult Index(int id){return Json(_studentRepository.GetStudent(id));}[Route("{id?}")]public IActionResult Details(int? id){Student model = _studentRepository.GetStudent(id??1);return View(model);}public ObjectResult detail(){return new ObjectResult(_studentRepository.GetStudent(1));}}
在实际项目中运用到的例子---下载文件
[ApiExplorerSettings(IgnoreApi = true)]public class DownFileController : Controller{private ILogger _logger;/// <summary>/// 下载Pscan文件/// </summary>/// <param name="taskId"></param>/// <param name="DownloadFilePath"></param>/// <param name="fileNameList"></param>/// <returns></returns>[Route("[Controller]/{taskId}/{DownloadFilePath?}/{fileName?}")]public IActionResult GetDownFileMessage(string taskId, string DownloadFilePath, string fileName){try{if (fileName != null){//远程部署//string path = "/home/ftp_flow/Data/TaskData/" + taskId + "/" + DownloadFilePath;//string zipPath = "/Data/PscanDownFile/" + $"{DownloadFilePath+"/"+fileNameList}.zip";//本地调试string path = @"E:\beijingData\TaskData\" + taskId + "/" + DownloadFilePath;Console.WriteLine(path);var filePath = Path.Combine(path, fileName);if (System.IO.File.Exists(filePath)){Console.WriteLine(filePath);string fileExt = Path.GetExtension(filePath);//获取文件的ContentTypevar provider = new FileExtensionContentTypeProvider();var memi = provider.Mappings[fileExt];var stream = System.IO.File.OpenRead(filePath);Console.WriteLine("success");return File(stream, memi, Path.GetFileName(filePath));}else{return NotFound();}}else{return NotFound();}}catch (Exception ex){return NotFound();}}}