web的请求到达后端服务时,controller(控制器)会处理传入的http请求并响应用户操作,请求的url会被映射到控制器的操作方法上。
此映射过程由应用程序中定义的路由规则完成。
路由使用一对由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);
- //获取文件的ContentType
- var 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();
- }
- }
- }