首页 > 编程语言 >Asp.Net Core 中的“虚拟目录”

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

时间:2024-06-21 16:54:07浏览次数:23  
标签:Core Asp 虚拟目录 new Net FileProvider

原文链接: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/ 

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

 

标签:Core,Asp,虚拟目录,new,Net,FileProvider
From: https://www.cnblogs.com/Dongmy/p/18260881

相关文章

  • vb.net c#一键编绎引用DLL如何做?编绎成独立EXE
    .netc#一键编绎引用如何做?3个工程有依懒关系ClassLibrary1,ClassLibrary2,MainProject(主工程)ClassLibrary2依赖ClassLibrary1,MainProject依赖前2个如何实现一键按顺序编绎,自动添加前面2个生成的DLL到主工程,并且设置为不复制到输出目录,"生成操作"属性选择"嵌入的资源"VSI......
  • Anthropic 发布 Claude 3.5 Sonnet;欧洲杯首次引入虚拟实时广告丨 RTE 开发者日报 Vol.
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观......
  • Asp.Net Core 获取应用程序相关目录
    原文链接:https://blog.csdn.net/hefeng_aspnet/article/details/135859719在ASP.NETCore中,可以通过以下三种方式获取应用程序所在目录:1、使用`AppContext.BaseDirectory`属性:  stringappDirectory=AppContext.BaseDirectory;例如:D:\后端项目\testCore\test.WebApi\bin\D......
  • .NET Core的文件系统[3]:由PhysicalFileProvider构建的物理文件系统
    原文链接:https://blog.csdn.net/weixin_33795833/article/details/90324791ASP.NETCore应用中使用得最多的还是具体的物理文件,比如配置文件、View文件以及网页上的静态文件,物理文件系统的抽象通过PhysicalFileProvider这个FileProvider来实现,该类型定义在NuGet包“Microsoft.Ext......
  • C# 之 .net core -- 创建项目
    原文链接:https://www.cnblogs.com/hkzw/p/12001420.html一、新建一个Web的应用程序 二、选择项目的基本信息(.netcoer2.2 和带有试图控制器的程序)在这里创建的是MVC模式,也可以用其他的,比如空的、web应用程序。跟平常开的的那种表面上差别不大,总之需要什么选什么 ......
  • .NET 6 Swagger+JWT 配置
    1.1封装一个SwaggerExtend类(包含JWT配置)///<summary>///Swagger静态类///</summary>publicstaticclassSwaggerExtend{///<summary>///添加服务:swagger///</summary>///<paramname=&qu......
  • Anthropic 推出 Claude 3.5 Sonnet,称新模型优于 GPT-4 Omni
    近日,人工智能研究公司Anthropic宣布推出其最新的语言模型Claude3.5Sonnet,并声称该模型在多个方面优于OpenAI的GPT-4Omni。这一消息在人工智能领域引起了广泛关注和讨论。本文将详细介绍Claude3.5Sonnet的技术特点、应用前景以及其与GPT-4Omni的对比。http://www.z......
  • Anthropic 的 Claude 3.5 Sonnet 在企业人工智能竞赛中胜过 OpenAI 和谷歌
    全球领先的人工智能研究公司Anthropic宣布推出Claude3.5Sonnet,这是一款集无与伦比的性能和成本效益于一身的开创性人工智能模型。克劳德模型系列的最新迭代产品将彻底改变企业人工智能的格局,以低于竞争对手的成本为企业提供最先进的功能。Anthropic联合创始人Daniel......
  • 【车载网络协议】【Ethernet】【ARP】【第二章-字段介绍】
    一、报文类型ARP协议中的请求(Request)和响应(Reply)是通过特定的字段来进行交换信息的。下面是对ARP请求和响应字段的详细介绍。二、请求报文硬件类型(HardwareType):指定网络接口的硬件类型,例如以太网通常使用1表示以太网。协议类型(ProtocolType):指定网络层协议类型,例如IPv4......
  • 【车载网络协议】【Ethernet】【ARP】【第三章-缓存介绍】
    一、概念简介ARP(AddressResolutionProtocol)是一种用于将网络层地址(IP地址)解析为数据链路层地址(MAC地址)的协议。ARPCache是ARP协议在计算机或网络设备上维护的一个重要数据结构,用于存储IP地址与对应的MAC地址之间的映射关系。本文将介绍ARPCache的作用、工作原理......