返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >Asp.Net Core 中的“虚拟目录”实现
  • 160
分享到

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

netASPASP.NET虚拟目录core 2022-06-07 20:06:31 160人浏览 八月长安
摘要

写在前面   现在部署ASP.net core应用已经不再限制于windows的IIS上,更多的是Docker容器、各种反向代理来部署。也有少部分用IIS部署的,IIS部署确实

写在前面

  现在部署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>
  /// 读取文本 (原文地址:https://www.cnblogs.com/EminemJK/p/13362368.html)
  /// </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/。设置好之后,就可以访问项目以外的路径了。

如在IIS部署的时候 ,可以直接忽略IIS中的虚拟目录设置,完完全全可以通过注入的配置来设置达到“虚拟目录”的效果。

简化配置

  为了方便达到真实项目中可以直接使用,那么就要设置为可配置的:

在appsettings.JSON中设置:


{
 "Logging": {
 "LogLevel": {
  "Default": "InfORMation",
  "Microsoft": "Warning",
  "Microsoft.Hosting.Lifetime": "Information"
 }
 },
 "AllowedHosts": "*",
 "VirtualPath": [
 {
  "RealPath": "F:\\test1", //真实路径
  "RequestPath": "/test",
  "Alias": "first"
 },
 {
  "RealPath": "F:\\test2", //真实路径
  "RequestPath": "/test",
  "Alias": "second"
 },
 {
  "RealPath": "F:\\test3", //真实路径
  "RequestPath": "/test",
  "Alias": "third"
 }
 ]
}

创建对应的实体映射:


public class VirtualPathConfig
 {
  public List<PathContent> VirtualPath { get; set; }
 }
 public class PathContent
 {
  public string RealPath { get; set; }
  public string RequestPath { get; set; }
  public string Alias { get; set; }
 }

在PhysicalFileProvider上封装一层,加入别名便于获取:


public class MyFileProvider : PhysicalFileProvider
  {
    public MyFileProvider(string root, string alias) : base(root)
    {
      this.Alias = alias;
    }
    public MyFileProvider(string root, Microsoft.Extensions.FileProviders.Physical.ExclusionFilters filters, string alias) : base(root, filters)
    {
      this.Alias = alias;
    }
    /// <summary>
    /// 别名
    /// </summary>
    public string Alias { get; set; }
  }

调整Startup.ConfigureServices和Startup.Configure:


public void ConfigureServices(IServiceCollection services)
    {
      services.AddControllers();
      services.Configure<VirtualPathConfig>(Configuration);
      var config = Configuration.Get<VirtualPathConfig>().VirtualPath;
      config.ForEach(f => 
      {
        services.AddSingleton(new MyFileProvider(f.RealPath,f.Alias));
      });
    }
    public void Configure(IApplicationBuilder app, IWEBHostEnvironment env)
    {
      if (env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
      }
      var config = Configuration.Get<VirtualPathConfig>().VirtualPath;
      config.ForEach(f =>
      {
        app.UseStaticFiles(new StaticFileOptions()
        {
          FileProvider = new PhysicalFileProvider(f.RealPath),
          RequestPath =f.RequestPath
        });
      });
      app.UseRouting();
      app.UseAuthorization();
      app.UseEndpoints(endpoints =>
      {
        endpoints.MapControllers();
      });
    }

最后,调整调用方式,即可。


[HttpGet]
    public object GetFiles([FromServices] IEnumerable<MyFileProvider> fileProviders)
    {
      var file = fileProviders.FirstOrDefault(x=>x.Alias=="first").GetFileInfo("mybook.txt");
      if (file.Exists)
      {
        return ReadTxtContent(file.PhysicalPath);
      }
      return 0;
    }
最后

  物理文件系统的抽象通过PhysicalFileProvider这个FileProvider来实现,借助IFileProvider的特点,其实可以扩展实现轻量“云盘”的功能了,而不仅仅只是实现IIS虚拟目录功能。搞定,今晚不加班!

到此这篇关于Asp.Net Core 中的“虚拟目录”实现的文章就介绍到这了,更多相关Asp.Net Core 虚拟目录内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文章:.net core 读取本地指定目录下的文件的实例代码


--结束END--

本文标题: Asp.Net Core 中的“虚拟目录”实现

本文链接: https://lsjlt.com/news/30747.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Asp.Net Core 中的“虚拟目录”实现
    写在前面   现在部署Asp.Net Core应用已经不再限制于Windows的IIS上,更多的是Docker容器、各种反向代理来部署。也有少部分用IIS部署的,IIS部署确实...
    99+
    2022-06-07
    net ASP ASP.NET 虚拟目录 core
  • Asp.net core中依赖注入的实现
    使用服务 在Asp.net core的Controller中,可以通过如下两种方式获取系统注入的服务: 构造函数 可以直接在构造函数中传入所依赖的服务,这是非常常见的DI注入方式。 ...
    99+
    2024-04-02
  • ASP.NET的Core AD域登录过程怎么实现
    本文小编为大家详细介绍“ASP.NET的Core AD域登录过程怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“ASP.NET的Core AD域登录过程怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-06-29
  • ASP.NET Core中的响应压缩的实现
    介绍# 响应压缩技术是目前Web开发领域中比较常用的技术,在带宽资源受限的情况下,使用压缩技术是提升带宽负载的首选方案。我们熟悉的Web服务器,比如IIS、Tomcat、Ng...
    99+
    2022-06-07
    ASP.NET 压缩 core net ASP
  • ASP.NET Core中间件初始化的实现
    目录前言  自定义的方式 Use方式 基于约定的方式 实现IMiddleware的方式 源码探究 Use扩展方法 UseMiddleware 总结 前言  ...
    99+
    2024-04-02
  • ASP.NET Core项目中调用WebService的方法
    一、前言 现实生产中,有一些比较老的系统对外提供的接口都是WebService形式的,如果是使用.NET Framework创建的项目调用WebService非常方便,网上有很多代码...
    99+
    2024-04-02
  • ASP.NET Core中使用Redis实现缓存
    目录一、前言二、安装StackExchange.Redis三、添加配置四、Redis帮助类五、添加服务依赖项六、在控制器中使用七、测试一、前言 我们这里以StackExchange....
    99+
    2024-04-02
  • 虚拟机Linux中目录的命令(2)
    今天想和大家分享,我们在远程登陆Linux中进行的一些命令。分为创建目录,删除空目录,创建文件,删除目录和文件,复制,移动 名称功能参数是否有重命名功能mkdir(创建目录)创建目录-p无rmdir(删除空目录)删除空目录-p无rm(删除目...
    99+
    2023-10-06
    linux 运维 服务器
  • ASP.NET Core中间件实现限流的代码
    目录一、限流算法1.计数器算法1.1 固定窗口算法1.2 滑动窗口算法2.令牌桶算法3.漏桶算法二、ASP.NET Core中间件实现限流1.中间件代码2.在管道中的使用一、限流算法...
    99+
    2024-04-02
  • ASP.NET Core中MVC模式实现路由一
    目录1.前言2.设置路由中间件3.传统路由4.多个路由4.1定义多个路由4.2区分操作5.属性路由5.1 属性路由5.2 使用 Http[Verb] 属性的属性路由5.3合并路由5....
    99+
    2024-04-02
  • ASP.NET Core中MVC模式实现路由二
    目录1.URL生成2.URL生成方式2.1根据操作名称生成URL2.2根据路由生成URL2.3在HTML中生成URL2.4在操作结果中生成URL3.区域(Area)4.实现IActi...
    99+
    2024-04-02
  • ASP.NET Core中怎么实现远程调试
    这篇文章给大家介绍ASP.NET Core中怎么实现远程调试,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。体验Web Deploy这种发布方式可直接将代码打包发到指定服务器的指定站点下,十分方便。远程调试注意事项若要使...
    99+
    2023-06-19
  • ASP.NET Core中间件怎么实现限流
    本篇内容介绍了“ASP.NET Core中间件怎么实现限流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、限流算法在高并发系统中...
    99+
    2023-06-29
  • ASP.NET Core MVC中怎么实现过滤器
    本篇内容介绍了“ASP.NET Core MVC中怎么实现过滤器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!过滤器如何...
    99+
    2023-06-29
  • Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现
    起因: 近期项目中,提供了一些调用频率较高的api接口,需要保障服务器的稳定运行;需要对提供的接口进行限流控制。避免因客户端频繁的请求导致服务器的压力。 一、AspNetCoreRa...
    99+
    2024-04-02
  • ASP.NET Core中使用令牌桶限流的实现
    在限流时一般会限制每秒或每分钟的请求数,简单点一般会采用计数器算法,这种算法实现相对简单,也很高效,但是无法应对瞬时的突发流量。 比如限流每秒100次请求,绝大多数的时间里都不会超过...
    99+
    2024-04-02
  • 利用ASP.Net Core中的Razor实现动态菜单
    目录准备1.实现思路2.编码2.1  建立渲染内容填充方法2.2  建立分部视图2.3 调用分布视图准备 1.框架 .netcore  版本 ...
    99+
    2024-04-02
  • ASP.NET Core中间件初始化的实现方法
    小编给大家分享一下ASP.NET Core中间件初始化的实现方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!前言  在日常使用ASP.NET Core开发的过程中我们多多少少会设计到使用中间件的场景,...
    99+
    2023-06-15
  • ASP.NET Core如何使用Log4net实现日志记录功能
    这篇文章主要介绍“ASP.NET Core如何使用Log4net实现日志记录功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ASP.NET Core如何使用Log4net实现日...
    99+
    2023-06-29
  • ASP.NET Core中如何实现重定向详解
    前言 ASP.NET Core 是一个跨平台,开源的,轻量级的,模块化的,用于构建高性能的 web 开发框架, ASP.NET Core MVC 内置了多种方式将一个 requ...
    99+
    2022-06-07
    重定向 ASP.NET net core ASP
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作