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

    自此结束。

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

     

  • 相关阅读:
    Win7系统怎样防止注册表被篡改【系统天地】
    Win10总是自动安装应用怎么办【系统天地】
    win10系统更新完不能开机怎么办【系统天地】
    Win7系统系统还原被禁用怎么办【系统天地】
    Win7系统如何删除远程访问功能?【系统天地】
    win10系统如何修复防火墙【系统天地】
    win10如何扩大c盘空间【系统天地】
    PHP redis扩展安装
    redis的安装部署与测试
    Nginx和PHP如何配合工作
  • 原文地址:https://www.cnblogs.com/kubishishu/p/4413593.html
Copyright © 2011-2022 走看看