Asp.Net Core 中的“虚拟目录”

news/2024/9/25 19:25:29

原文链接:https://blog.csdn.net/sD7O95O/article/details/107587430

现在部署Asp.Net Core应用已经不再限制于Windows的IIS上,更多的是Docker容器、各种反向代理来部署。也有少部分用IIS部署的,IIS部署确实是又快又简单,图形化操作三下五除二就可以发布好一个系统了。在过去Asp.Net MVC 项目部署的时候,还常常使用IIS一个功能——虚拟目录。

 虚拟目录可以直接定位到非项目的其他路径,将路径作为网站的一部分,可实现上传文件保存到其他盘符或间接的使用项目以外的静态文件。在Asp.Net MVC中从虚拟路径中存取文件也很简单,如:

Server.MapPath("~/Upload/liohuang.jpg");

  

但在Asp.Net Core上不同,它被抽象出一个“文件系统”,也就是FileProvider。FileProvider是对所有实现了IFileProvider接口的所有类型以及对应对象的统称,文件系统在Artech蒋老师的《.NET Core的文件系统[2]:FileProvider是个什么东西?》文章中已经透析了,这里不在罗里吧嗦了。

这篇文章要解决的内容是:Asp.Net Core应用中,如何优雅的使用“虚拟目录”。

实操
首先,新建一个.Net Core WebApi空项目部署在D盘,“虚拟目录”假设物理路径在F盘,分别创建三个测试目录 F:/test1 、 F:/test2 和 F:/test3 ,目录里分别存放对应的文件1/2/3.jpg 和 mybook.txt 。

读取虚拟目录文件
在 Startup.ConfigureServices 注入 IFileProvider :

services.AddSingleton<IFileProvider>(new PhysicalFileProvider("F:\\test1"));

  新建一个控制器,读取 mybook.txt 中的内容:

[ApiController]
[Route("[controller]/[action]")]
public class LioHuangController : ControllerBase
{[HttpGet]public object GetFiles([FromServices]IFileProvider fileProvider){var file = fileProvider.GetFileInfo("mybook.txt");if (file.Exists){return ReadTxtContent(file.PhysicalPath);}return 0;}/// <summary>/// 读取文本/// </summary>private string ReadTxtContent(string Path){if (!System.IO.File.Exists(Path)){return "Not found!";}using (StreamReader sr = new StreamReader(Path, Encoding.UTF8)){StringBuilder sb = new StringBuilder();string content;while ((content = sr.ReadLine()) != null){sb.Append(content);}return sb.ToString();}}
}

  访问接口,接口读取文件之后,返回内容:

 IFileProvider 接口采用目录来组织文件,并统一使用 IFileInfo 接口来表示, PhysicalPath 表示文件的物理路径。

public interface IFileInfo
{bool Exists { get; }bool IsDirectory { get; }DateTimeOffset LastModified { get; }string Name { get; }string PhysicalPath { get; }Stream CreateReadStream();
}

  如多个虚拟目录,怎么处理?简单,注入多个 IFileProvider 即可:

services.AddSingleton<IFileProvider>(new PhysicalFileProvider("F:\\test1"));
services.AddSingleton<IFileProvider>(new PhysicalFileProvider("F:\\test2"));
services.AddSingleton<IFileProvider>(new PhysicalFileProvider("F:\\test3"));

  代码修改为:

public object GetFiles([FromServices] IEnumerable<IFileProvider> fileProviders)

  

IEnumerable<IFileProvider> fileProviders 接口数组将会有三个,按注入的顺序对应不同的目录。当然,注入 IFileProvider 的时候,就可以封装一层了,下面再讲。

另外,有的说直接 ReadTxtContent("F:\test1\mybook.txt"); 不香吗?香,Asp.Net Core的访问权限要比Asp.Net MVC之前老版本项目要高许多,确实是可以直接读取项目以外的文件,但是并不适合直接去访问,除非说你只有一个地方使用到,那么就可以直接读取,但静态的文件的访问,就访问不到了,仅仅是后台读取而已。所以统一使用 IFileProvider 来约束,代码的可维护性要高许多。

静态文件访问
  在Startup.Configure设置静态文件目录,即可:

app.UseStaticFiles(new StaticFileOptions()
{FileProvider = new PhysicalFileProvider("F:\\test1"),RequestPath = "/test"
});;
app.UseStaticFiles(new StaticFileOptions()
{FileProvider = new PhysicalFileProvider("F:\\test2"),RequestPath = "/test"
});
app.UseStaticFiles(new StaticFileOptions()
{FileProvider = new PhysicalFileProvider("F:\\test3"),RequestPath = "/test"
});

  

FileProvider 同上面所说的,设置好物理路径的根目录, RequestPath 则是访问路径的前缀,必须是斜杆 “/” 开头,访问地址前缀则为:

 https://localhost:5001/test/ 

设置好之后,就可以访问项目以外的路径了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/46163.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

通义灵码上线 Visual Studio 插件市场啦!

通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等能力,提供代码智能生成、研发智能问答能力。通义灵码,是阿里云出品的一款基于通义大…

电脑IPv6正常但是外部无法ping或者ping不通解决办法

常见问题咨询解决运营商屏蔽 设备没有正确获取IPv6,只是局域网IPv6 路由器没有开启相关功能推荐一个测试网站,IPv4和IPv6多点查询 - 设备IP地址多点查询测试平台:https://v6.qjcq.net打开网站后其他设备扫码进入后可以在页面上全部显示ip地址所有问题排查之后还有无法ping通打…

Windows Server 2016 OVF, updated Jun 2024 (sysin) - VMware 虚拟机模板

Windows Server 2016 OVF, updated Jun 2024 (sysin) - VMware 虚拟机模板Windows Server 2016 OVF, updated Jun 2024 (sysin) - VMware 虚拟机模板 2024 年 6 月版本更新,现在自动运行 sysprep,支持 ESXi Host Client 部署 请访问原文链接:https://sysin.org/blog/windows…

KubeSphere 社区双周报|2024.06.07-06.20

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2024.06.07-06.20。 贡献者名单新晋 KubeSphere co…

vue3实现模拟地图上,站点名称按需显示的功能

很久很久没有更新博客了,因为实在是太忙了,每天都有公司的事情忙不完....... 最近在做车辆模拟地图,在实现控制站点名称按需显示时,折腾了好一段时间,特此记录一下。最终界面如下图所示:站点显示需求:首末站必须显示,从第一个站开始,如果站点名称能显示下,则显示,如…

redisson WRONGPASS invalid username-password pair or user is disable

1、技术架构:若依微服务框架<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.1</version></dependency> <dependency><groupId>…

dc-2

开放了80、7744端口访问80端口发现不能正常显示,URL里有dc-2的地址,本地无法解析域名添加域名后可以正常访问第一个页面可以找到flag1找到登录页面用wpscan扫一下,爆出3个用户将用户放到de-2users.list里面使用flag1中提示的工具cewl生成密码字典dc-2pass.dic使用wpscan工具…

2024新版本dbeaver改字体大小

窗口-》首选项-》外观/颜色字体-》dbeaver fonts