当前位置:网站首页>浅浅理解.net core的路由

浅浅理解.net core的路由

2022-07-07 15:32:00 旧时量刑

路由:

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);
                        //获取文件的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();
            }
        }
    }

原网站

版权声明
本文为[旧时量刑]所创,转载请带上原文链接,感谢
https://blog.csdn.net/hyyjiushiliangxing/article/details/125599324