当前位置:网站首页>浅浅理解.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();
}
}
}
边栏推荐
- How does laravel run composer dump autoload without emptying the classmap mapping relationship?
- 第九届 蓝桥杯 决赛 交换次数
- dapp丨defi丨nft丨lp单双币流动性挖矿系统开发详细说明及源码
- Have fun | latest progress of "spacecraft program" activities
- 【Android -- 数据存储】使用 SQLite 存储数据
- [designmode] facade patterns
- 正在准备面试,分享面经
- Laravel5.1 Routing - routing packets
- Master this set of refined Android advanced interview questions analysis, oppoandroid interview questions
- 3000 words speak through HTTP cache
猜你喜欢
随机推荐
[designmode] flyweight pattern
二叉搜索树(特性篇)
[vulnhub range] thales:1
[summary of knowledge] summary of notes on using SVN in PHP
【DesignMode】模板方法模式(Template method pattern)
值得一看,面试考点与面试技巧
【Android -- 数据存储】使用 SQLite 存储数据
Laravel5.1 Routing - routing packets
无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
第九届 蓝桥杯 决赛 交换次数
Temperature sensor chip used in temperature detector
Master this set of refined Android advanced interview questions analysis, oppoandroid interview questions
time标准库
全网“追杀”钟薛高
作为Android开发程序员,android高级面试
最新2022年Android大厂面试经验,安卓View+Handler+Binder
Laravel changed the session from file saving to database saving
Laravel service provider instance tutorial - create a service provider test instance
【C 语言】 题集 of Ⅹ
谈谈 SAP 系统的权限管控和事务记录功能的实现