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);

    自此结束。

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

     

  • 相关阅读:
    C# 图片与Base64的相互转化
    LeetCode 303. Range Sum Query – Immutable
    LeetCode 300. Longest Increasing Subsequence
    LeetCode 292. Nim Game
    LeetCode 283. Move Zeroes
    LeetCode 279. Perfect Squares
    LeetCode 268. Missing Number
    LeetCode 264. Ugly Number II
    LeetCode 258. Add Digits
    LeetCode 257. Binary Tree Paths
  • 原文地址:https://www.cnblogs.com/kubishishu/p/4413593.html
Copyright © 2011-2022 走看看