asp.net 5 中应用程序根目录及物理文件根目录的获取方式 此文已过期,不再适应rc1以后的版本
之前看了asp.net5,小弟就试着用了用,做了个小网站练习一下,有一个小模块需要上传图片到wwwroot下的images文件夹,但是aspnet5 发生了翻天复地变化,之前获取网站根目录的的方法不再适用。去网上翻遍了文章也没找到方法,无奈之下想到看看源码(大神不要见笑,我也看不懂,只是胡乱的看),终于让我看到一个类:
namespace Microsoft.Framework.Runtime
{
[AssemblyNeutral]
public interface IApplicationEnvironment
{
string ApplicationBasePath { get; }
string ApplicationName { get; }
string Configuration { get; }
FrameworkName RuntimeFramework { get; }
string Version { get; }
}
但是这个接口的实现类怎么去获得呢?经过几番尝试,找到了一个方法:
var approot = Context.ApplicationServices.GetService<IApplicationEnvironment>().ApplicationBasePath;
根据获取的应用程序根路径在拼接自己的字符串,就可以获取到 存放图片的文件夹的路径,喜出望外啊,但是接下来问题来了,把网站发布之后,目录结构发生了变化,运行报错了,于是想到了project.json这个文件下的第一项:
这是发布前:"webroot": "wwwroot"
这是发布后:"webroot": "../../../../../wwwroot"
这样一来不就很简单了嘛,先获取project.json这个文件,然后获取节点“webroot”,在于之前的获得到的应用程序根路径也就是approot进行拼接不就可以了,方法如下:
var config = new Configuration().AddJsonFile("project.json").AddEnvironmentVariables();
var wwwroot=config.Get<string>("webroot");
但是运行起来却报错了,没有权限获取到“project.json”,有的同学会说直接写死不久可以了吗,效果如下:
var approot = Context.ApplicationServices.GetService<IApplicationEnvironment>().ApplicationBasePath;
// var wwwroot = approot + "\\wwwroot";//发布前
var wwrrot = approot + "..\\..\\..\\..\\..\\wwwroot";//发布后
其实这样也勉强可以,就是缺少了点灵活性,比如像 吧wwwroot目录改名为www(因为买的虚拟空间网站更目录必须为www)就需要在代码中再做修改;不过当前也没更好的方法,只能这样做了。
一次偶然用aspnet 自承载测试的时候,报了一个错误:

想到了这是因为把 wwwroot文件夹改名为www,而project.config里面却没有改过来(还是wwwroot),这不就是因为找到wwwroot文件夹而报的错误,喜出望外啊,顺藤摸瓜,用反编译软件查看这两个类,终于看到如下代码:
public HostingEnvironment(IApplicationEnvironment appEnvironment, IEnumerable<IConfigureHostingEnvironment> configures)
{
this.EnvironmentName = "Development";
this.WebRoot = HostingUtilities.GetWebRoot(appEnvironment.get_ApplicationBasePath());
this.WebRootFileProvider = new PhysicalFileProvider(this.WebRoot);
using (IEnumerator<IConfigureHostingEnvironment> enumerator = configures.GetEnumerator())
{
while (enumerator.MoveNext())
{
enumerator.Current.Configure(this);
}
}
}
就是这一句 this.WebRoot = HostingUtilities.GetWebRoot(appEnvironment.get_ApplicationBasePath());困扰多日的问题终于解决了;完整的获取aspnet5网站 物理文件根目录的代码如下:
var approot = Context.ApplicationServices.GetService<IApplicationEnvironment>().ApplicationBasePath; var wwwroot = Microsoft.AspNet.Hosting.HostingUtilities.GetWebRoot(approot);
自此结束。
小弟第一次写博客,不太善于表达,望大神们不要见怪
asp.net 5 中应用程序根目录及物理文件根目录的获取方式 此文已过期,不再适应rc1以后的版本的更多相关文章
- 在ASP.NET Core中使用EPPlus导入出Excel文件
这篇文章说明了如何使用EPPlus在ASP.NET Core中导入和导出.xls/.xlsx文件(Excel).在考虑使用.NET处理excel时,我们总是寻找第三方库或组件.使用Open Offic ...
- 在Asp.Net Core中使用中间件保护非公开文件
在企业开发中,我们经常会遇到由用户上传文件的场景,比如某OA系统中,由用户填写某表单并上传身份证,由身份管理员审查,超级管理员可以查看. 就这样一个场景,用户上传的文件只能有三种人看得见(能够访问) ...
- WP8.1开发中找程序下的Assets文件夹
这俩天在开发另一个程序时,遇到一个小问题:如何调用程序下的Assets文件夹及其下的文件和文件夹: 在网上找了两天,基本上是关于如何调用手机中库的方法,没找到有关介绍如何调用查找 编译前添加图片或其它 ...
- asp.net项目中通过Web.config配置文件及文件夹的访问权限!
描述:在开发中我们通常会碰到这样的问题,例如:在项目的根目录下面有一个文件或者文件夹需要用户登陆后才能访问.如果用户在没有登录的情况下访问该文件或者该文件夹下面的文件时,直接拦截重定向到对应的登陆页面 ...
- asp.net项目中通过Web.config配置文件及文件夹的访问权限---forms
十分全面的forms验证配置: http://blog.csdn.net/qingyun1029/article/details/6184723
- [小技巧]ASP.NET Core中如何预压缩静态文件
原文地址:Pre-compressed static files with ASP.NET Core 作者:Gunnar Peipman 译者:Lamond Lu 译文:https://www.cnb ...
- ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解 (转载)
“传导体” HttpContext 要理解 HttpContext 是干嘛的,首先,看图 图一 内网访问程序 图二 反向代理访问程序 ASP.NET Core 程序中,Kestrel 是一个基于 li ...
- ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解
笔者没有学 ASP.NET,直接学 ASP.NET Core ,学完 ASP.NET Core MVC 基础后,开始学习 ASP.NET Core 的运行原理.发现应用程序有一个非常主要的 “传导体” ...
- (6)ASP.NET Core 中使用IHttpClientFactory发出HTTP请求
1.HttpClient类使用存在的问题 HttpClient类的使用所存在的问题,百度搜索的文章一大堆,好多都是单纯文字描述,让人感觉不太好理解,为了更好理解HttpClient使用存在的问题,下面 ...
随机推荐
- jquery总结06-动画事件02-上卷下拉动画
.slideDown() 下拉动画 动画执行之后的操作写在回调函数里 $("ele").slideDown(1000, function() { //等待动画执行1秒后,执行别的动 ...
- Linux SHELL,环境变量
SHELL: 在计算机科学中,Shell俗称壳(用来区别于核),是指"提供使用者使用界面"的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe.它接收用户命 ...
- java ZipOutputStream压缩文件,ZipInputStream解压缩
java中实现zip的压缩与解压缩.java自带的 能实现的功能比较有限. 本程序功能:实现简单的压缩和解压缩,压缩文件夹下的所有文件(文件过滤的话需要对File进一步细节处理). 对中文的支持需要使 ...
- windows界面库种类
访问网址http://www.360doc.com/content/14/0612/20/13826502_386093297.shtml
- SQLserver2008数据库备份和还原问题(还原是必须有完整备份)
首先,我要说明的是你必须拥有完整的数据库备份,下面的还原教程,才算有用,如果其它问题,请搜索别的大牛的解决办法,本方法只适合菜鸟. 这个连接是站长大人的异常恢复方法,有问题可以自己学习http://w ...
- myeclipse下构建maven web项目
首先创建一个Maven的Project如下图 我们勾选上Create a simple project (不使用骨架) 这里的Packing 选择 war的形式 由于packing是war包,那么下面 ...
- struts中Cookie实现记住密码
HttpServletRequest request = ServletActionContext.getRequest(); Cookie[] cookies = request.getCookie ...
- mongo 相关命令
mongo导入数据: 1. 先进入找到mongo 安装目录 执行 ./mongo 进入mongo 2. mongorestore -u 用户名 -p 密码 -d 数据库 —drop 文件存在路径 显示 ...
- yii2-basic后台管理功能开发之四:图片上传FileInput
我采用的是 kartik-v/yii2-widget-fileinput的文件上传插件,大家可以去github查看详细的安装方法和使用说明. 需求:上传图片+可以预览缩略图 在这里说说我碰到的问题:限 ...
- C#如果把A.new()编译成new A()
缘由 对于初次接触某个第三方库的C#开发者,假如要调用里面一个方法,发现需要一个A类型的实例作为参数,怎么获得这个实例呢? 我想大多数人会先尝试new A吧: 如果没有,可能会尝试输入A.看看有没可能 ...