.Net Core 获取应用物理路径的常见问题
如果要得到传统的ASP.Net应用程序中的相对路径或虚拟路径对应的服务器物理路径,只需要使用使用Server.MapPath()方法来取得Asp.Net根目录的物理路径。
但是在Asp.Net Core中不存在Server.MapPath()方法,Controller基类也没有Server属性。
在Asp.Net Core中取得物理路径:
从ASP.NET Core 2.0开始,可以通过注入 IHostingEnvironment 服务对象来取得Web根目录和内容根目录的物理路径,IHostingEnvironment保留了应用程序的基本信息,如下所示
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc; namespace ConsoleApp1
{
public class HomeController : Controller
{
private readonly IHostingEnvironment _hostingEnvironment; public HomeController(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
} public ActionResult Index()
{
//Web根目录
string webRootPath = _hostingEnvironment.WebRootPath;
//内容根目录
string contentRootPath = _hostingEnvironment.ContentRootPath; return Content(webRootPath + "\n" + contentRootPath);
}
}
}

这里要注意区分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,
var path = System.IO.Directory.GetCurrentDirectory();
Console.WriteLine(path);
输出 C:\Users\LIKUI\source\repos\ConsoleApp1\ConsoleApp1\bin\Debug\netcoreapp2.2

2. 反射方法: 获取当前执行dll所在目录
var doPath = Assembly.GetEntryAssembly().Location;
Console.WriteLine(doPath);

3. 反射方法: 动态方式获取当前可执行类文件所在目录
dynamic type = (new Program()).GetType();
string currentDirectory = Path.GetDirectoryName(type.Assembly.Location);

string webRootPath = _hostingEnvironment.WebRootPath;//为null,wwwroot目录,且没有启用静态文件服务需要开启服务。在
Startup.cs的Configure中添加app.UseStaticFiles();,并且在应用根目录中添加文件夹命名为wwwroot即可

启动程序Startup类:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
} app.UseStaticFiles();
app.UseHttpsRedirection();
app.UseMvc();
}
5. 修改mvc/api中wwwroot静态文件夹的路径
首先在wwwroot文件下放上test.txt文件内容为测试文件。
运行后访问http://localhost:44395/test.txt显示为测试文件。
说明默认静态文件起作用,如果不想在默认的应用程序下放wwwroot或者静态文件路径已经指向了固定位置,则需要使用StaticFileOptions修改默认静态文件夹的路径

比如这里我引用本地桌面的一个文件
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
} //引用自定义路径静态文件
var path = @"C:\Users\LIKUI\Desktop\试点项目\";
var staticFile = new StaticFileOptions();
staticFile.FileProvider = new PhysicalFileProvider(path);
app.UseStaticFiles(staticFile); app.UseHttpsRedirection();
app.UseMvc();
}
如图:

public void ConfigureServices(IServiceCollection services)
{
services.AddDirectoryBrowser();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
} //引用自定义文件路径
var path = @"C:\Users\LIKUI\Desktop\试点项目\";
var staticFile = new StaticFileOptions();
staticFile.FileProvider = new PhysicalFileProvider(path);
app.UseStaticFiles(staticFile); //显示静态文件路径下的所有文件
var staticBrowser = new DirectoryBrowserOptions();
staticBrowser.FileProvider = new PhysicalFileProvider(path);
app.UseDirectoryBrowser(staticBrowser); app.UseHttpsRedirection();
app.UseMvc();
}
如图:

.log,.conf等为文本文件格式
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
} //引用自定义文件路径
var path = @"C:\Users\LIKUI\Desktop\试点项目\";
var staticFile = new StaticFileOptions();
staticFile.FileProvider = new PhysicalFileProvider(path);
staticFile.ServeUnknownFileTypes = true;
staticFile.DefaultContentType = "application/x-msdownload";//设置默认MIME,此处为下载 var fileExtensionContentTypeProvider = new FileExtensionContentTypeProvider();
fileExtensionContentTypeProvider.Mappings.Add(".log", "text/plain");//设置特定类型的MIME
fileExtensionContentTypeProvider.Mappings.Add(".conf", "text/plain");
staticFile.ContentTypeProvider = fileExtensionContentTypeProvider;
app.UseStaticFiles(staticFile); //显示静态文件路径下的所有文件
var staticBrowser = new DirectoryBrowserOptions();
staticBrowser.FileProvider = new PhysicalFileProvider(path);
app.UseDirectoryBrowser(staticBrowser); app.UseHttpsRedirection();
app.UseMvc();
}
这样就可以打开了

.Net Core 获取应用物理路径的常见问题的更多相关文章
- Windows 批处理获取某路径下最新创建的文件的名称
批处理获取某路径下最新创建的文件的名称 by:授客 QQ:1033553122 echo off setlocal enabledelayedexpansion rem 设置文件所在目录 set sr ...
- .NET Core 中的路径问题
NET Core 应用程序相对于以前的.NET Framework 应用程序在启动运行的方式上有一定的差异,今天就来谈一谈这个获取应用程序启动路径的问题. 1.工作路径 WorkingDirector ...
- Asp.Net Core获取请求信息/获取请求地址
一.Asp.Net Core 2.0版本中目前HttpRequest是个抽象类 在控制器或视图上下文中获取到的 Request对象,是 DefaultHttpRequest的实例. 定义 如图 : ...
- Asp.Net Core Web相对路径、绝对路径整理
一.相对路径 1.关于Asp.Net Core中的相对路径主要包括两个部分:一.Web根目录,即当前网站的目录为基础:二.内容目录wwwroot文件夹,对于静态文件都放在这个目录. 2.获取控制器,A ...
- katalon系列十四:执行Windows命令&获取项目路径
Katalon Studio中也可以运行Windows命令执行一些系统操作. 根据官方文档,在test case中输入命令:cmd = 'del E:\\shot\\*.xlsx E:\\shot\\ ...
- java获取项目路径,url路径
我的web项目名iamgeModel. 工作空间在D盘 先获取url相关: 需要是HttpServletRequest request; 获取IP: request.getServerName() / ...
- C# 获取文件路径
1.C# 获取文件路径:http://www.cnblogs.com/bq-blog/archive/2012/09/01/2666394.html
- JAVA获取服务器路径的方法
1.在JSF环境中获取到ServletContext: 1 2 ServletContext sc = (ServletContext)FacesContext. getCurrent ...
- java代码中获取classpath路径
Javaweb工程中,有时候需要自己手动的去读取classpath下面的配置文件,这里总结一点读取classpath路径的方法,分享一下. 方法一: String path = Test.class. ...
随机推荐
- MySQL 加锁和死锁解析
目录 产生死锁的必要条件 锁是加在那里的? 操作与加锁的对照关系 Insert Delete Update GAP锁 什么时候加next-key lock? Insert Intention Lock ...
- python测试开发django-69.templates模板过滤器filter
前言 templates 模板里面过滤器 filter 的作用是对变量的出来,比如小写转大写,替换一些特殊字符,对列表取值,排序等操作. 内置的过滤器有很多,本篇拿几个常用的过滤器做案例讲解下相关的功 ...
- phpcms网站迁移无法更新内容提示Table 'led_com.lz_' doesn't exist的解决方法
新接的一位客户说要把旧phpcms网站迁移到新的服务器并更换新域名,这对ytkah是小菜一碟,但往往事与愿违,忽略了一些细节会很惨的.进入新站后台怎么都无法生成内容,提示Table 'led_com. ...
- JavaScript遍历
- Flask内的特殊装饰器
@app.template_global() # 全局变量 @app.template_filter() # 偏函数 @app.before_request # 请求进入视图函数之前,比 ...
- 洛谷p3353在你窗外闪耀的星星题解
题目 首先被题目甜到了 本来搜标签搜的线段树,结果发现这题目很吸引我我果断点开 觉得前缀和就能A啊 于是乎 要注意 窗户旁边是可以看到的 所以前缀和的时候是不用再-1的 //前缀和 //注意坑点 // ...
- Codeforces Round 564 题解
很抱歉让标题把您骗进来了. 这是一场打得最失败的div1. 作为一个橙名一题都不会…… 旁边紫名的PB怒切3题,div2的也随便玩玩出了div1b/div2d…… 这名字颜色也太有水分了. 也就只会2 ...
- 基于Linux(中标麒麟)上QT的环境搭建
最近由于公司需要,需要在中标麒麟上进行QT的二次开发,但是网上的资料很少,就算是有也基本都是其他的版本的Linux上的搭建.中标麒麟本身的资料也很好,而且还只能试用60天. 下面就介绍下我对此环境的搭 ...
- vue+element 表单验证
效果图 <template> <div class="formValidator"> <div v-for="(item,index) in ...
- Burp Suite 入门教程(BURP SUITE TUTORIAL )
参考链接1:https://www.pentestgeek.com/what-is-burpsuite 参考链接2:https://www.pentestgeek.com/web-applicatio ...