zoukankan      html  css  js  c++  java
  • .Net Core 获取应用物理路径的常见问题

    如果要得到传统的ASP.Net应用程序中的相对路径或虚拟路径对应的服务器物理路径,只需要使用使用Server.MapPath()方法来取得Asp.Net根目录的物理路径。

    但是在Asp.Net Core中不存在Server.MapPath()方法,Controller基类也没有Server属性。

    在Asp.Net Core中取得物理路径:

    从ASP.NET Core 2.0开始,可以通过注入 IHostingEnvironment 服务对象来取得Web根目录和内容根目录的物理路径,IHostingEnvironment保留了应用程序的基本信息,如下所示

       using Microsoft.AspNetCore.Hosting;
       using Microsoft.AspNetCore.Mvc;
    
       namespace ConsoleApp1
        {
            public class HomeController : Controller
            {
                private readonly IHostingEnvironment _hostingEnvironment;
    
                public HomeController(IHostingEnvironment hostingEnvironment)
                {
                    _hostingEnvironment = hostingEnvironment;
                }
    
                public ActionResult Index()
                {
    //Web根目录
    string webRootPath = _hostingEnvironment.WebRootPath;
              //内容根目录
    string contentRootPath = _hostingEnvironment.ContentRootPath; return Content(webRootPath + " " + contentRootPath); } } }

    这里要注意区分Web根目录 和 内容根目录的区别:

    Web根目录是指提供静态内容的根目录,即asp.net core应用程序根目录下的wwwroot目录

    内容根目录是指应用程序的根目录,即asp.net core应用的应用程序根目录

    在ASP.NET Core 2.0之前 (就是ASP.NET Core 1.0),通过 IApplicationEnvironment.ApplicationBasePath 来获取 Asp.Net Core应用程序的根目录(物理路径) 。但是现在3都出来了,并且之前版本不完善,很多api都没有,也就不推荐使用了。

    当然也有其他方式获取路径:

    System.IO

    命名空间System.IO中存在Directory类,提供了获取应用程序运行当前目录的静态方法 System.IO.Directory.GetCurrentDirectory()=>Gets the current working directory of the application,
    在.net core中此方法不是真正的获取应用程序的当前方法,而是执行dotnet命令所在目录
    var path = System.IO.Directory.GetCurrentDirectory();
    Console.WriteLine(path);

    输出 C:UsersLIKUIsource eposConsoleApp1ConsoleApp1inDebug etcoreapp2.2

    控制台路径

    2. 反射方法: 获取当前执行dll所在目录

     var doPath = Assembly.GetEntryAssembly().Location;
     Console.WriteLine(doPath);

    3. 反射方法: 动态方式获取当前可执行类文件所在目录

    dynamic type = (new Program()).GetType();
    string currentDirectory = Path.GetDirectoryName(type.Assembly.Location);
    注意:如果新建项目时选择的时api模式,string webRootPath = _hostingEnvironment.WebRootPath;//为null,
    因为默认没有wwwroot目录,且没有启用静态文件服务需要开启服务。
    Startup.csConfigure中添加app.UseStaticFiles();,并且在应用根目录中添加文件夹命名为wwwroot即可

    启动程序Startup类:

     public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                    app.UseHsts();
                }
    
                app.UseStaticFiles();
                app.UseHttpsRedirection();
                app.UseMvc();
            }

    5. 修改mvc/api中wwwroot静态文件夹的路径

    首先在wwwroot文件下放上test.txt文件内容为测试文件。
    运行后访问http://localhost:44395/test.txt显示为测试文件。

    说明默认静态文件起作用,如果不想在默认的应用程序下放wwwroot或者静态文件路径已经指向了固定位置,则需要使用StaticFileOptions修改默认静态文件夹的路径

     比如这里我引用本地桌面的一个文件

     public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                    app.UseHsts();
                }
                
                //引用自定义路径静态文件
                var path = @"C:UsersLIKUIDesktop试点项目";
                var staticFile = new StaticFileOptions();
                staticFile.FileProvider = new PhysicalFileProvider(path);
                app.UseStaticFiles(staticFile);
    
                app.UseHttpsRedirection();
                app.UseMvc();
            }

    如图:

     

          public void ConfigureServices(IServiceCollection services)
          {
            services.AddDirectoryBrowser();
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
          }



         public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } //引用自定义文件路径 var path = @"C:UsersLIKUIDesktop试点项目"; var staticFile = new StaticFileOptions(); staticFile.FileProvider = new PhysicalFileProvider(path); app.UseStaticFiles(staticFile); //显示静态文件路径下的所有文件 var staticBrowser = new DirectoryBrowserOptions(); staticBrowser.FileProvider = new PhysicalFileProvider(path); app.UseDirectoryBrowser(staticBrowser); app.UseHttpsRedirection(); app.UseMvc(); }

     如图:

    浏览器默认支持浏览的格式是有限的,并且iis或其他service提供的mime也是有限的,所以就需要增加配置iis的mime类型,
    当遇到不识别的MIME类型的时候默认为下载,或者可以在应用程序中指定部分类型为可识别类型,如.log,.conf等为文本文件格式

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                    app.UseHsts();
                }
    
                //引用自定义文件路径
                var path = @"C:UsersLIKUIDesktop试点项目";
                var staticFile = new StaticFileOptions();
                staticFile.FileProvider = new PhysicalFileProvider(path);
                staticFile.ServeUnknownFileTypes = true;
                staticFile.DefaultContentType = "application/x-msdownload";//设置默认MIME,此处为下载
    
                var fileExtensionContentTypeProvider = new FileExtensionContentTypeProvider();
                fileExtensionContentTypeProvider.Mappings.Add(".log", "text/plain");//设置特定类型的MIME
                fileExtensionContentTypeProvider.Mappings.Add(".conf", "text/plain");
                staticFile.ContentTypeProvider = fileExtensionContentTypeProvider;
                app.UseStaticFiles(staticFile);
    
                //显示静态文件路径下的所有文件
                var staticBrowser = new DirectoryBrowserOptions();
                staticBrowser.FileProvider = new PhysicalFileProvider(path);
                app.UseDirectoryBrowser(staticBrowser);
    
                app.UseHttpsRedirection();
                app.UseMvc();
            }

    这样就可以打开了

     
  • 相关阅读:
    CSS 控制table 滑动及调整列宽等问题总结
    Java读取properties文件
    水晶报表打印
    C# 运行时序列化
    C#attribute-----------初级
    c# 单元测试工程如何取得当前项目路径
    C# 字段、属性、成员变量
    水晶报表主子报表分页问题
    从0打卡leetcode之day 3 -- 最大子序列和
    从零打卡leetcode之day 2---两数相加
  • 原文地址:https://www.cnblogs.com/likui-bookHouse/p/11984460.html
Copyright © 2011-2022 走看看