如果要得到传统的ASP.Net应用程序中的相对路径或虚拟路径对应的服务器物理路径,只需要使用使用Server.MapPath()方法来取得Asp.Net根目录的物理路径。

但是在Asp.Net Core中不存在Server.MapPath()方法,Controller基类也没有Server属性。

在Asp.Net Core中取得物理路径:

从ASP.NET Core 2.0开始,可以通过注入 IHostingEnvironment 服务对象来取得Web根目录和内容根目录的物理路径,IHostingEnvironment保留了应用程序的基本信息,如下所示

  1. using Microsoft.AspNetCore.Hosting;
  2. using Microsoft.AspNetCore.Mvc;
  3.  
  4. namespace ConsoleApp1
  5. {
  6. public class HomeController : Controller
  7. {
  8. private readonly IHostingEnvironment _hostingEnvironment;
  9.  
  10. public HomeController(IHostingEnvironment hostingEnvironment)
  11. {
  12. _hostingEnvironment = hostingEnvironment;
  13. }
  14.  
  15. public ActionResult Index()
  16. {
    //Web根目录
  17. string webRootPath = _hostingEnvironment.WebRootPath;
              //内容根目录
  18. string contentRootPath = _hostingEnvironment.ContentRootPath;
  19.  
  20. return Content(webRootPath + "\n" + contentRootPath);
  21. }
  22. }
  23. }

这里要注意区分Web根目录 和 内容根目录的区别:

Web根目录是指提供静态内容的根目录,即asp.net core应用程序根目录下的wwwroot目录

内容根目录是指应用程序的根目录,即asp.net core应用的应用程序根目录

在ASP.NET Core 2.0之前 (就是ASP.NET Core 1.0),通过 IApplicationEnvironment.ApplicationBasePath 来获取 Asp.Net Core应用程序的根目录(物理路径) 。但是现在3都出来了,并且之前版本不完善,很多api都没有,也就不推荐使用了。

当然也有其他方式获取路径:

System.IO

命名空间System.IO中存在Directory类,提供了获取应用程序运行当前目录的静态方法 System.IO.Directory.GetCurrentDirectory()=>Gets the current working directory of the application,

在.net core中此方法不是真正的获取应用程序的当前方法,而是执行dotnet命令所在目录
  1. var path = System.IO.Directory.GetCurrentDirectory();
  2. Console.WriteLine(path);

输出 C:\Users\LIKUI\source\repos\ConsoleApp1\ConsoleApp1\bin\Debug\netcoreapp2.2

控制台路径

2. 反射方法: 获取当前执行dll所在目录

  1. var doPath = Assembly.GetEntryAssembly().Location;
  2. Console.WriteLine(doPath);

3. 反射方法: 动态方式获取当前可执行类文件所在目录

  1. dynamic type = (new Program()).GetType();
  2. string currentDirectory = Path.GetDirectoryName(type.Assembly.Location);
注意:如果新建项目时选择的时api模式,string webRootPath = _hostingEnvironment.WebRootPath;//为null,
因为默认没有wwwroot目录,且没有启用静态文件服务需要开启服务。
Startup.csConfigure中添加app.UseStaticFiles();,并且在应用根目录中添加文件夹命名为wwwroot即可

启动程序Startup类:

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. else
  8. {
  9. // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
  10. app.UseHsts();
  11. }
  12.  
  13. app.UseStaticFiles();
  14. app.UseHttpsRedirection();
  15. app.UseMvc();
  16. }

5. 修改mvc/api中wwwroot静态文件夹的路径

首先在wwwroot文件下放上test.txt文件内容为测试文件。
运行后访问http://localhost:44395/test.txt显示为测试文件。

说明默认静态文件起作用,如果不想在默认的应用程序下放wwwroot或者静态文件路径已经指向了固定位置,则需要使用StaticFileOptions修改默认静态文件夹的路径

比如这里我引用本地桌面的一个文件

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. else
  8. {
  9. // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
  10. app.UseHsts();
  11. }
  12.  
  13. //引用自定义路径静态文件
  14. var path = @"C:\Users\LIKUI\Desktop\试点项目\";
  15. var staticFile = new StaticFileOptions();
  16. staticFile.FileProvider = new PhysicalFileProvider(path);
  17. app.UseStaticFiles(staticFile);
  18.  
  19. app.UseHttpsRedirection();
  20. app.UseMvc();
  21. }

如图:

      public void ConfigureServices(IServiceCollection services)
      {
        services.AddDirectoryBrowser();
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
      }

  1.  
  2.      public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  3. {
  4. if (env.IsDevelopment())
  5. {
  6. app.UseDeveloperExceptionPage();
  7. }
  8. else
  9. {
  10. // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
  11. app.UseHsts();
  12. }
  13.  
  14. //引用自定义文件路径
  15. var path = @"C:\Users\LIKUI\Desktop\试点项目\";
  16. var staticFile = new StaticFileOptions();
  17. staticFile.FileProvider = new PhysicalFileProvider(path);
  18. app.UseStaticFiles(staticFile);
  19.  
  20. //显示静态文件路径下的所有文件
  21. var staticBrowser = new DirectoryBrowserOptions();
  22. staticBrowser.FileProvider = new PhysicalFileProvider(path);
  23. app.UseDirectoryBrowser(staticBrowser);
  24.  
  25. app.UseHttpsRedirection();
  26. app.UseMvc();
  27. }

如图:

浏览器默认支持浏览的格式是有限的,并且iis或其他service提供的mime也是有限的,所以就需要增加配置iis的mime类型,
当遇到不识别的MIME类型的时候默认为下载,或者可以在应用程序中指定部分类型为可识别类型,如.log,.conf等为文本文件格式

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. if (env.IsDevelopment())
  4. {
  5. app.UseDeveloperExceptionPage();
  6. }
  7. else
  8. {
  9. // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
  10. app.UseHsts();
  11. }
  12.  
  13. //引用自定义文件路径
  14. var path = @"C:\Users\LIKUI\Desktop\试点项目\";
  15. var staticFile = new StaticFileOptions();
  16. staticFile.FileProvider = new PhysicalFileProvider(path);
  17. staticFile.ServeUnknownFileTypes = true;
  18. staticFile.DefaultContentType = "application/x-msdownload";//设置默认MIME,此处为下载
  19.  
  20. var fileExtensionContentTypeProvider = new FileExtensionContentTypeProvider();
  21. fileExtensionContentTypeProvider.Mappings.Add(".log", "text/plain");//设置特定类型的MIME
  22. fileExtensionContentTypeProvider.Mappings.Add(".conf", "text/plain");
  23. staticFile.ContentTypeProvider = fileExtensionContentTypeProvider;
  24. app.UseStaticFiles(staticFile);
  25.  
  26. //显示静态文件路径下的所有文件
  27. var staticBrowser = new DirectoryBrowserOptions();
  28. staticBrowser.FileProvider = new PhysicalFileProvider(path);
  29. app.UseDirectoryBrowser(staticBrowser);
  30.  
  31. app.UseHttpsRedirection();
  32. app.UseMvc();
  33. }

这样就可以打开了

 

.Net Core 获取应用物理路径的常见问题的更多相关文章

  1. Windows 批处理获取某路径下最新创建的文件的名称

    批处理获取某路径下最新创建的文件的名称 by:授客 QQ:1033553122 echo off setlocal enabledelayedexpansion rem 设置文件所在目录 set sr ...

  2. .NET Core 中的路径问题

    NET Core 应用程序相对于以前的.NET Framework 应用程序在启动运行的方式上有一定的差异,今天就来谈一谈这个获取应用程序启动路径的问题. 1.工作路径 WorkingDirector ...

  3. Asp.Net Core获取请求信息/获取请求地址

     一.Asp.Net Core 2.0版本中目前HttpRequest是个抽象类 在控制器或视图上下文中获取到的 Request对象,是 DefaultHttpRequest的实例. 定义 如图 : ...

  4. Asp.Net Core Web相对路径、绝对路径整理

    一.相对路径 1.关于Asp.Net Core中的相对路径主要包括两个部分:一.Web根目录,即当前网站的目录为基础:二.内容目录wwwroot文件夹,对于静态文件都放在这个目录. 2.获取控制器,A ...

  5. katalon系列十四:执行Windows命令&获取项目路径

    Katalon Studio中也可以运行Windows命令执行一些系统操作. 根据官方文档,在test case中输入命令:cmd = 'del E:\\shot\\*.xlsx E:\\shot\\ ...

  6. java获取项目路径,url路径

    我的web项目名iamgeModel. 工作空间在D盘 先获取url相关: 需要是HttpServletRequest request; 获取IP: request.getServerName() / ...

  7. C# 获取文件路径

    1.C# 获取文件路径:http://www.cnblogs.com/bq-blog/archive/2012/09/01/2666394.html

  8. JAVA获取服务器路径的方法

    1.在JSF环境中获取到ServletContext: 1 2 ServletContext sc = (ServletContext)FacesContext.         getCurrent ...

  9. java代码中获取classpath路径

    Javaweb工程中,有时候需要自己手动的去读取classpath下面的配置文件,这里总结一点读取classpath路径的方法,分享一下. 方法一: String path = Test.class. ...

随机推荐

  1. MySQL查询优化一例——也说说 Using intersect

    生产上面有一条sql查询很慢,需要7到8秒左右,简化之后的sql如下所示: SELECT mingxi.* FROM ( SELECT btjc01.id, department.`name` AS ...

  2. Flink流式计算

    Structured Streaming A stream is converted into a dynamic table. A continuous query is evaluated on ...

  3. Ubuntu18.04安装cudnn7.6.1

    注:如果使用anaconda,貌似不需要安装cuda和cudnn,安装tensorflow时会自动安装 1.进入nvidia官网https://developer.nvidia.com/cudnn下载 ...

  4. javascript打开窗口

    项目中javascript代码,早期使用了只有ie支持的方法:Window createPopup() 方法 那个时候是2009年,而现在已经是2019-12-11了.如何改造这个早期的代码呢? 找到 ...

  5. Python并发编程内容回顾

    Python并发编程内容回顾 并发编程小结 目录 • 一.到底什么是线程?什么是进程? • 二.Python多线程情况下: • 三.Python多进程的情况下: • 四.为什么有这把GIL锁? • 五 ...

  6. hbase运行原理

    HBase特点 1)海量存储 Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据.这与Hbase的极易扩展性息息相关.正式因为Hbase良好 ...

  7. yarn rest api未授权漏洞

    项目集群之前在yarn8088的web资源管理页面上看到一堆莫名的定时任务,就是黑客利用漏洞挖矿,最后禁用了8088端口. freebuff传送门: https://www.freebuf.com/v ...

  8. chrome-解决该扩展程序未列在 Chrome 网上应用店中

    1.win10添加策略组 复制以下内容到.bat文件中,右键-以管理员身份运行,即可添加策略组 pushd "%~dp0" dir /b C:\Windows\servicing\ ...

  9. B 题解————2019.10.16

    相信他说的话,但不要当真 [题目描述]有一个长度为 n 的自然数序列 a,要求将这个序列恰好分成至少 m 个连续子段. 每个子段的价值为该子段的所有数的按位异或.要使所有子段的价值按位与的结果最大,输 ...

  10. 【可持久化0/1Trie】【P4735】最大异或和

    Description 给定一个长度为 \(n\) 的序列 \(A\),有 \(m\) 次操作,每次要么在序列尾部再添加一个数,将序列长度 \(n\) 加一,要么给进行一次查询,给定查询参数 \(l, ...