zoukankan      html  css  js  c++  java
  • 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);

    自此结束。

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

     

  • 相关阅读:
    python安装cnstd卡住
    _、__、__xx__之间的差别
    Celery模块使用
    同一主机,开启多个不同端口的redis进程
    php配置变更记录
    Linux安装Nodejs
    ElasticSearch中term和match探索
    Centos安装elasticsearch,php连接使用
    centos8自定义目录安装php7.3
    centos8自定义目录安装nginx
  • 原文地址:https://www.cnblogs.com/kubishishu/p/4413593.html
Copyright © 2011-2022 走看看