• 浅浅理解.net core的路由


    路由:

    web的请求到达后端服务时,controller(控制器)会处理传入的http请求并响应用户操作,请求的url会被映射到控制器的操作方法上。

    此映射过程由应用程序中定义的路由规则完成。

     ASP.NET.Core MVC中的路由

    路由使用一对由UseRouting和UseEndPoints注册的中间件:

    UseRouting向中间件管道添加路由匹配。此中间件会查看应用中定义的终结点集,并根据请求选择最佳匹配

    UseEndpoints向中间件管道添加终结点执行。

    asp.net.core有两种路由技术:常规路由和属性路由

    常规路由:

    1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    2. {
    3. if (env.IsDevelopment())
    4. {
    5. app.UseDeveloperExceptionPage();
    6. }
    7. app.UseStaticFiles();
    8. app.UseMvcWithDefaultRoute();
    9. }

    默认路由模板{controller=Home}/{action = Index}/{id?},大多数的URL都会按照这个规则进行映射。问号表示 id 参数可有可无。

     如果要定义自己的路径模板,要使用 UseMvc()方法,而不是 UseMvcWithDefaultRoute()方法。

    1. app.UseMvc(routes =>
    2. {
    3. routes.MapRoute("default""{controller=Home}/{action = Index}/{id?}");
    4. });

     

    1. //1、启用默认路由
    2. app.UseStaticFiles();
    3. app.UseRouting();
    4. app.UseMvcWithDefaultRoute();
    5. //2、自定义路由模板
    6. app.UseStaticFiles();
    7. app.UseRouting();
    8. app.UseMvc(routes =>
    9. {
    10. routes.MapRoute(
    11. name: "default",
    12. template: "{controller=Home}/{action=Index}/{id?}");
    13. });
    14. //3、使用UseEndpoints自定义路由模板
    15. app.UseStaticFiles();
    16. app.UseRouting();
    17. app.UseEndpoints(endpoints =>
    18. {
    19. endpoints.MapControllerRoute(
    20. name: "default",
    21. pattern: "{controller=Home}/{action=Index}/{id?}");
    22. });

    属性路由:

    使用属性路由,可以在Controller或 Controller 的操作方法上应用Route属性。

    在Startp.cs文件Configure方法中,我们只使用app.UseMvc();然后在Controller的Action方法上通过特性Route来配置。

    1.  [Route("[controller]/[action]")]
    2. public class HomeController : Controller
    3. {
    4. private readonly IStudentRepository _studentRepository;
    5. //构造函数注入
    6. public HomeController(IStudentRepository studentRepository)
    7. {
    8. _studentRepository = studentRepository;
    9. }
    10. [Route("")]
    11. [Route("~/")] //解决 http://localhost:44338/ 访问不了问题
    12. [Route("~/home")] //解决 http://localhost:44338/home 访问不了问题
    13. public IActionResult Index(int id)
    14. {
    15. return Json(_studentRepository.GetStudent(id));
    16. }
    17. [Route("{id?}")]
    18. public IActionResult Details(int? id)
    19. {
    20. Student model = _studentRepository.GetStudent(id??1);
    21. return View(model);
    22. }
    23. public ObjectResult detail()
    24. {
    25. return new ObjectResult(_studentRepository.GetStudent(1));
    26. }
    27. }

    在实际项目中运用到的例子---下载文件

    1. [ApiExplorerSettings(IgnoreApi = true)]
    2. public class DownFileController : Controller
    3. {
    4. private ILogger _logger;
    5. /// <summary>
    6. /// 下载Pscan文件
    7. /// </summary>
    8. /// <param name="taskId"></param>
    9. /// <param name="DownloadFilePath"></param>
    10. /// <param name="fileNameList"></param>
    11. /// <returns></returns>
    12. [Route("[Controller]/{taskId}/{DownloadFilePath?}/{fileName?}")]
    13. public IActionResult GetDownFileMessage(string taskId, string DownloadFilePath, string fileName)
    14. {
    15. try
    16. {
    17. if (fileName != null)
    18. {
    19. //远程部署
    20. //string path = "/home/ftp_flow/Data/TaskData/" + taskId + "/" + DownloadFilePath;
    21. //string zipPath = "/Data/PscanDownFile/" + $"{DownloadFilePath+"/"+fileNameList}.zip";
    22. //本地调试
    23. string path = @"E:\beijingData\TaskData\" + taskId + "/" + DownloadFilePath;
    24. Console.WriteLine(path);
    25. var filePath = Path.Combine(path, fileName);
    26. if (System.IO.File.Exists(filePath))
    27. {
    28. Console.WriteLine(filePath);
    29. string fileExt = Path.GetExtension(filePath);
    30. //获取文件的ContentType
    31. var provider = new FileExtensionContentTypeProvider();
    32. var memi = provider.Mappings[fileExt];
    33. var stream = System.IO.File.OpenRead(filePath);
    34. Console.WriteLine("success");
    35. return File(stream, memi, Path.GetFileName(filePath));
    36. }
    37. else
    38. {
    39. return NotFound();
    40. }
    41. }
    42. else
    43. {
    44. return NotFound();
    45. }
    46. }
    47. catch (Exception ex)
    48. {
    49. return NotFound();
    50. }
    51. }
    52. }

  • 相关阅读:
    机器学习基础-手写数字识别
    CDN加速器有哪些?
    动手学深度学习(Pytorch版)代码实践 -深度学习基础-08多层感知机简洁版
    跟TED演讲学英文:Entertainment is getting an AI upgrade by Kylan Gibbs
    在一个使用了 Sass 的 React Webpack 项目中安装和使用 Tailwind CSS
    使用scala语言编写代码,一键把hive中的DDLsql转化成MySql中的DDLsql
    【Kafka】分区与复制机制:解锁高性能与容错的密钥
    2022年十三届蓝桥杯国赛(C/C++大学B组)个人题解
    初识Python——Python环境安装配置
    华纳云:SQLserver配置远程连接的方法是什么
  • 原文地址:https://blog.csdn.net/hyyjiushiliangxing/article/details/125599324