博客
关于我
asp.net 5 中应用程序根目录及物理文件根目录的获取方式 此文已过期,不再适应rc1以后的版本
阅读量:428 次
发布时间:2019-03-06

本文共 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);

自此结束。

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

 

转载地址:http://xycyz.baihongyu.com/

你可能感兴趣的文章
Kali安装Docker
查看>>
ServerSuperIO Designer IDE 发布,打造物联网通讯大脑,随心而联。附:C#驱动源代码。
查看>>
Java 持久化操作之 --XML
查看>>
程序员如何提高工作效率
查看>>
(转)在ASP.NET 中实现单点登录(利用Cache, 将用户信息保存在服务器缓存中)
查看>>
【Azure 应用服务】在Azure Funciton中使用Powershell脚本函数,需要存储一些变量值如何解决?
查看>>
RabbitMQ核心概念篇
查看>>
权限管理系统系列之序言
查看>>
Java程序员学习Go指南(终)
查看>>
Go语言实现布谷鸟过滤器
查看>>
Mysql多数据库备份
查看>>
微信小程序setData子元素
查看>>
github: Permission denied (publickey). 问题解决方法
查看>>
Docker常用操作
查看>>
查看已经开放的端口,查看和清理tomcat日志文件
查看>>
ORA-00600: internal error code, arguments: [kole_t2u], [34]
查看>>
TX锁处理
查看>>
使用UTF8字符集存储中文生僻字
查看>>
去除空格函数trim
查看>>
应用人员反馈报错,ORA-03137: TTC protocol internal error : [12333]
查看>>