asp.net 5 中应用程序根目录及物理文件根目录的获取方式

之前看了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);

自此结束。

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

时间: 2024-10-10 08:10:19

asp.net 5 中应用程序根目录及物理文件根目录的获取方式的相关文章

在ASP.NET Core中使用EPPlus导入出Excel文件

原文:在ASP.NET Core中使用EPPlus导入出Excel文件 这篇文章说明了如何使用EPPlus在ASP.NET Core中导入和导出.xls/.xlsx文件(Excel).在考虑使用.NET处理excel时,我们总是寻找第三方库或组件.使用Open Office Xml格式(xlsx)读取和写入Excel 2007/2010文件的最流行的.net库之一是EPPlus.这个库现在已经支持.NET Core许久了.这适用于Windows,Linux和Mac. 因此,让我们创建一个新的AS

在Asp.Net Core中使用中间件保护非公开文件

在企业开发中,我们经常会遇到由用户上传文件的场景,比如某OA系统中,由用户填写某表单并上传身份证,由身份管理员审查,超级管理员可以查看. 就这样一个场景,用户上传的文件只能有三种人看得见(能够访问) 上传文件的人 身份审查人员 超级管理员 那么,这篇博客中我们将一起学习如何设计并实现一款文件授权中间件 问题分析 如何判断文件属于谁 要想文件能够被授权,文件的命名就要有规律,我们可以从文件命名中确定文件是属于谁的,例如本文例可以设计文件名为这样 工号-GUID-[Front/Back] 例如: 1

asp.net项目中通过Web.config配置文件及文件夹的访问权限!

描述:在开发中我们通常会碰到这样的问题,例如:在项目的根目录下面有一个文件或者文件夹需要用户登陆后才能访问.如果用户在没有登录的情况下访问该文件或者该文件夹下面的文件时,直接拦截重定向到对应的登陆页面. 例一: 我想让用户在访问我的程序的Admin文件夹下的页面时需要登录,而在访问其他页面时则不需要,也就是说Admin文件夹下的文件拒绝匿名访问. 下面是配置根目录下的web.config文件中关于授权验证的配置. [xhtml] view plaincopy <system.web> <

IIS中应用程序切换物理路径遇到的问题

问题描述: 应用系统版本升级,IIS中应用程序直接更新物理路径到新版本应用路径. 浏览应用时发现,页面上某一按钮点击事件是旧版本的点击事件.这时候我猜是浏览器缓存原因,删除缓存,问题依然存在. 百思不得其解. 如果我重新部署应用,还会不会出现这个问题.果不其然,新部署应用访问一切正常. 猜想可能是IIS在更换物理路径时仍然存在IIS缓存,更深次的原因还未知,待深入了解. 写到这里,主要是要在以后的实施部署时起到一个警示作用. 如果,查到相关资料,再更新总结.

在ASP.NET MVC中使用NuGet添加SignalR类库之后,再次运行程序时,它出现了一个异常:

自从在ASP.NET MVC中使用NuGet添加SignalR类库之后,再次运行程序时,它出现了一个异常: Server Error in '/' Application. The following errors occurred while attempting to load the app.- No assembly found containing an OwinStartupAttribute.- No assembly found containing a Startup or [

转载 ASP.NET MVC中使用ASP.NET Identity - 新西兰程序员 - 博客园

转载原地址: http://blog.jobbole.com/90695/ 在之前的文章中,我为大家介绍了OWIN和Katana,有了对它们的基本了解后,才能更好的去学习ASP.NET Identity,因为它已经对OWIN 有了良好的集成. 在这篇文章中,我主要关注ASP.NET Identity的建立和使用,包括基础类的搭建和用户管理功能的实现-- http://myusermanagement.azurewebsites.net/Account/Login?ReturnUrl=%2F 点此

ASP.NET Core 中文文档 第三章 原理(1)应用程序启动

原文:Application Startup 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:谢炀(kiler398).许登洋(Seay) ASP.NET Core 为你的应用程序提供了处理每个请求的完整控制.Startup 类是应用程序的入口(entry point),这个类可以设置配置(configuration)并且将应用程序将要使用的服务连接起来.开发人员可以在 Startup 类中配置请求管道,该管道将用于处理应用程序的所有请求. 章节: Startup 类 Co

在 ASP.NET MVC Web 应用程序中输出 RSS Feeds

RSS全称Really Simple Syndication.一些更新频率较高的网站可以通过RSS让订阅者快速获取更新信息.RSS文档需遵守XML规范的,其中必需包含标题.链接.描述信息,还可以包含发布时间.最后更新时间等信息. 本文将介绍通过LINQ to XML生成XML文档,并在ASP.NET MVC Web应用程序中输出. 在生成RSS文档前,先简单了解一下RSS的结构.根节点rss下有channel节点,channel节点的一些子节点(title,link,description)包含

ASP.NET Core Web 应用程序系列(三)- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)

在上一章中主要和大家分享了在ASP.NET Core中如何使用Autofac替换自带DI进行构造函数的批量依赖注入,本章将和大家继续分享如何使之能够同时支持属性的批量依赖注入. 约定: 1.仓储层接口都以“I”开头,以“Repository”结尾.仓储层实现都以“Repository”结尾. 2.服务层接口都以“I”开头,以“Service”结尾.服务层实现都以“Service”结尾. 接下来我们正式进入主题,在上一章的基础上我们再添加一个web项目TianYa.DotNetShare.Core