asp.net 5 中应用程序根目录及物理文件根目录的获取方式 此文已过期,不再适应rc1以后的版本
发布日期:2021-05-09 04:15:02 浏览次数:11 分类:博客文章

本文共 2416 字,大约阅读时间需要 8 分钟。

之前看了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
().ApplicationBasePath;

根据获取的应用程序根路径在拼接自己的字符串,就可以获取到 存放图片的文件夹的路径,喜出望外啊,但是接下来问题来了,把网站发布之后,目录结构发生了变化,运行报错了,于是想到了project.json这个文件下的第一项:

这是发布前:"webroot": "wwwroot"

这是发布后:"webroot": "../../../../../wwwroot"

这样一来不就很简单了嘛,先获取project.json这个文件,然后获取节点“webroot”,在于之前的获得到的应用程序根路径也就是approot进行拼接不就可以了,方法如下:

var config = new Configuration().AddJsonFile("project.json").AddEnvironmentVariables();var wwwroot=config.Get
("webroot");

但是运行起来却报错了,没有权限获取到“project.json”,有的同学会说直接写死不久可以了吗,效果如下:

 

var approot = Context.ApplicationServices.GetService
().ApplicationBasePath; // var wwwroot = approot + "\\wwwroot";//发布前 var wwrrot = approot + "..\\..\\..\\..\\..\\wwwroot";//发布后

 

 

 

  其实这样也勉强可以,就是缺少了点灵活性,比如像 吧wwwroot目录改名为www(因为买的虚拟空间网站更目录必须为www)就需要在代码中再做修改;不过当前也没更好的方法,只能这样做了。

   一次偶然用aspnet 自承载测试的时候,报了一个错误:

 

想到了这是因为把 wwwroot文件夹改名为www,而project.config里面却没有改过来(还是wwwroot),这不就是因为找到wwwroot文件夹而报的错误,喜出望外啊,顺藤摸瓜,用反编译软件查看这两个类,终于看到如下代码:

public HostingEnvironment(IApplicationEnvironment appEnvironment, IEnumerable
configures) { this.EnvironmentName = "Development"; this.WebRoot = HostingUtilities.GetWebRoot(appEnvironment.get_ApplicationBasePath()); this.WebRootFileProvider = new PhysicalFileProvider(this.WebRoot); using (IEnumerator
enumerator = configures.GetEnumerator()) { while (enumerator.MoveNext()) { enumerator.Current.Configure(this); } } }

就是这一句   this.WebRoot = HostingUtilities.GetWebRoot(appEnvironment.get_ApplicationBasePath());困扰多日的问题终于解决了;完整的获取aspnet5网站 物理文件根目录的代码如下:

var approot = Context.ApplicationServices.GetService
().ApplicationBasePath; var wwwroot = Microsoft.AspNet.Hosting.HostingUtilities.GetWebRoot(approot);

自此结束。

小弟第一次写博客,不太善于表达,望大神们不要见怪

 

上一篇:.netcore跨平台 之 windows上编译,ubuntu上运行
下一篇:抛弃vuex ,拥抱ts,手撸泛型Store<T>!

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2025年04月05日 12时47分18秒