MVC 5中服务器端log4net日志文件下载链接构建问题
解决ASP.NET MVC中日志文件下载链接的正确构建问题
直接拼接路径字符串很容易因为虚拟目录、路由配置等问题导致链接错误,我们可以通过框架提供的工具方法来生成正确的URL,分两种场景给你解决方案:
场景1:Logs文件夹位于Web可访问目录(比如项目根目录/wwwroot)
这种情况下,我们可以用Url.Content()方法来解析虚拟路径,它会自动适配应用的根路径(包括部署在虚拟目录的情况),写法如下:
<td> <a href="@Url.Content("~/Logs/" + file.FileName)" title="@file.FileName" target="_blank">@file.FileName</a> </td>
~/会被框架自动转换成当前应用的根路径,比如如果你的应用部署在http://localhost/FinanceWeb/,生成的链接会是http://localhost/FinanceWeb/Logs/Finance-Web-2018-03-20.log,完全符合预期。
场景2:Logs文件夹不在Web可访问目录(或者需要权限验证)
如果日志文件夹放在了Web根目录外,或者你想限制只有特定用户能下载日志,直接通过URL访问就不行了,这时候需要写一个专门的下载Action来处理:
第一步:在Controller中添加下载Action
传统ASP.NET MVC写法:
public ActionResult DownloadLog(string fileName) { // 拼接日志文件的物理路径 var filePath = Server.MapPath("~/Logs/" + fileName); // 校验文件是否存在 if (!System.IO.File.Exists(filePath)) { return HttpNotFound(); } // 读取文件并返回下载结果 var fileBytes = System.IO.File.ReadAllBytes(filePath); return File(fileBytes, "text/plain", fileName); }
ASP.NET Core写法:
需要先注入IWebHostEnvironment来获取路径:
private readonly IWebHostEnvironment _webHostEnv; public YourController(IWebHostEnvironment webHostEnv) { _webHostEnv = webHostEnv; } public IActionResult DownloadLog(string fileName) { var filePath = Path.Combine(_webHostEnv.WebRootPath, "Logs", fileName); if (!System.IO.File.Exists(filePath)) { return NotFound(); } return PhysicalFile(filePath, "text/plain", fileName); }
第二步:在视图中生成Action链接
用Url.Action()来生成指向下载Action的链接:
<td> <a href="@Url.Action("DownloadLog", "YourControllerName", new { fileName = file.FileName })" title="@file.FileName">@file.FileName</a> </td>
这里把YourControllerName替换成你实际的控制器名称(比如LogController),框架会自动生成正确的路由链接,还能方便地添加权限验证逻辑。
内容的提问来源于stack exchange,提问作者DoomerDGR8
相关产品推荐
相关产品推荐

