之前看了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);
自此结束。
小弟第一次写博客,不太善于表达,望大神们不要见怪