中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Asp.Net Core項目中實現一個虛擬目錄

發布時間:2021-01-13 16:40:24 來源:億速云 閱讀:270 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關怎么在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();
   }
  }
 }

訪問接口,接口讀取文件之后,返回內容:

怎么在Asp.Net Core項目中實現一個虛擬目錄

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/。設置好之后,就可以訪問項目以外的路徑了。

怎么在Asp.Net Core項目中實現一個虛擬目錄

怎么在Asp.Net Core項目中實現一個虛擬目錄

怎么在Asp.Net Core項目中實現一個虛擬目錄

如在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;
    }

上述就是小編為大家分享的怎么在Asp.Net Core項目中實現一個虛擬目錄了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

来凤县| 太谷县| 怀柔区| 日喀则市| 阜新市| 台南县| 金堂县| 阳春市| 五莲县| 永和县| 泸定县| 菏泽市| 汉中市| 枞阳县| 绿春县| 珲春市| 阳原县| 诸城市| 嘉义市| 宁都县| 雷波县| 隆昌县| 前郭尔| 屯门区| 凤山市| 巴里| 丹阳市| 登封市| 博白县| 洪雅县| 封丘县| 卓资县| 平泉县| 北川| 郯城县| 安达市| 喀什市| 鄂州市| 滦平县| 错那县| 香河县|