netcore 获取应用程序或者站点根路径的一点知识和教训

最近在用abpvnext做报表导出,涉及到要在站点根目录生成pdf文件提供下载。于是就要获取站点根路径。

开头搜索资料提示用IWebHostEnvironment.ContentRootPath,来实现获取站点根目录。这个其实是正解。.netcore的通用规则,使用任何借口都是依赖注入,我是觉得这玩意挺麻烦的。

但是我是在一个业务类里面实现pdf文件生成,为了保持这个业务类的相对独立性,我又偷懒不想将IWebHostEnvironment通过控制器逐层传递依赖注入到业务类里面。 

鬼使神差的不知道怎么的搜到了可以使用AppContext.BaseDirectory属性来获取当前应用程序的根目录。重点是他不用注入再逐层传递啊, 不管三七二十一就用上了。  然后文件也能正常的在项目的bin\wwwroot 目录下面生成文件,但是等我用http+相对文件路径去到浏览器里访问文件的时候,他就死都访问不到,路径举例:
http://localhost:44315/File/Report/20231130/温湿度曲线报表_20231130000000130.pdf

   然后调试了很久,各种办法试,发现http方式只能访问到项目的根目录JQ.TAHM.HttpApi.Host这一级,在这一级的wwwroot目录里的文件是可以访问到的。 但是往下的 bin\Debug\net6.0\wwwroot\File\Report\20231130   这种,http他是访问不到的。

那就只能改为用IHostEnvironment,或者IWebHostEnvironment 来获取站点根目录了。使用IHostEnvironment.ContentRootPath 他这个获取到的是bin的父级 (站点根目录JQ.TAHM.HttpApi.Host)   

正好我还有了不用逐层注入传递接口,直接使用IHostEnvironment的办法。

下面这一行代码就可以通过IHostEnvironment取到站点根路径下的wwwroot。

var parentPath = Path.Combine(IOCProvider.GetService<IHostEnvironment>().ContentRootPath,"wwwroot"); 
如下图

重点在IOCProvider.GetService<IHostEnvironment>() 这个东西 的IOCProvider类代码如下,文件放在application层跟service平级的 。 
我浅显的个人猜测,这个类的ServiceProvider.GetService原理应该是通过反射从容器获取到传递进来的任何接口(类型)的实例。拿到实例了想干嘛就干嘛了,这样省去了一直需要通过注入来使用接口和接口的属性和方法的麻烦。

public static class IOCProvider{public static IServiceProvider ServiceProvider { get; set; }/// <summary>///   /// </summary>public static T GetService<T> ()=> (T)IOCProvider.ServiceProvider.GetService(typeof(T));}

他这个可以一次性引入,还涉及另外两个地方 

Program 的main当中使用 UseIOC()

CreateHostBuilder(args).Build().UseIOC().Run();    //这句应该是调用接下来的IOCExtensions.UseIOC 给上面的IOCProvider类初始化。

IOCExtensions类的UseIOC方法

public static class IOCExtensions{public static IHost UseIOC(this IHost host){IOCProvider.ServiceProvider = host.Services;return host;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/236192.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

世微 低功耗 PFM DC-DC 升压芯片 AP8105 干电池手持设备驱动IC

概述 AP8105 系列产品是一种高效率、低纹波、工作频率高的 PFM 升压 DC-DC 变换器。AP8105 系列产品仅需要四个外围元器件&#xff0c;就可完成将低输入的电池电压变换升压到所需的工作电压&#xff0c;非常适合于便携式 1&#xff5e;4 节普通电池应用的场合。电路采用了高性能…

2023.11.30 -hzmx电商平台建设项目05 - member会员主题建模开发

1.需求说明 1.11各类数据信息说明 说明:公司为了对不同会员进行不同的营销策略&#xff0c;对各类会员的数量都非常敏感&#xff0c;比如注册会员、消费会员、复购会员、活跃会员、沉睡会员。不仅需要看新增数量还要看累积数量。 9个指标:新增注册会员数,累计注册会员数(上一…

微服务--07--Seata 分布式事务

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 分布式事务1.认识Seata2.部署TC服务2.1.准备数据库表2.2.准备配置文件2.3.Docker部署 3.微服务集成Seata3.1.引入依赖3.2.改造配置3.3.添加数据库表3.4.测试 分布式…

Whisper

文章目录 使后感Paper Review个人觉得有趣的Log Mel spectrogram & STFT Trainingcross-attention输入cross-attention输出positional encoding数据 Decoding为什么可以有时间戳的信息 Test code 使后感 因为运用里需要考虑到时效和准确性&#xff0c;类似于YOLO&#xff…

用最少数量的箭引爆气球[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 有一些球形气球贴在一堵用XY平面表示的墙面上。墙面上的气球记录在整数数组points&#xff0c;其中points[i] [xstart, xend]表示水平直径在xstart和xend之间的气球。你不知道气球的确切y坐标。一支弓箭可以沿着x轴从不同点完全垂直…

【开源视频联动物联网平台】帧率、码率和分辨率

帧率、码率和分辨率是视频和图像处理中的重要概念&#xff0c;它们直接影响到视频的带宽占用和显示效果。在进行视频项目时&#xff0c;根据应用需求对视频参数进行调整是必要的&#xff0c;因此了解这些参数的具体含义和指标是非常重要的。 在进行视频项目时&#xff0c;需要…

类 —— 继承、多重继承

继承 一个类&#xff0c;继承另一个已有的类。&#xff08;在一个已存在的类的基础上建立一个新的类&#xff0c;并拥有其特性&#xff09; 是一个父类&#xff08;基类&#xff09;派生出子类&#xff08;派生类&#xff09;的过程。 派生类往往是基类的具象化&#xff0c;基…

基于GAN的多尺度门合并多模态MRI图像合成

Multi-Modal MRI Image Synthesis via GAN With Multi-Scale Gate Mergence 基于GAN的多尺度门合并多模态MRI图像合成背景贡献实验方法生成器gate mergence (GM) strategy&#xff08;门控融合策略&#xff09;判别器 损失函数Thinking 基于GAN的多尺度门合并多模态MRI图像合成…

WPF实战项目十九(客户端):修改RestSharp的引用

修改HttpRestClient&#xff0c;更新RestSharp到110.2.0&#xff0c;因为106版本和110版本的代码不一样&#xff0c;所以需要修改下代码 using Newtonsoft.Json; using RestSharp; using System; using System.Threading.Tasks; using WPFProjectShared;namespace WPFProject.S…

java springboot通过application配置文件生成随机值并控制范围

我们找到 项目的 application 配置文件 这里我们还是习惯用 yml格式的 我们在配置文件中 写出 ${random.} 的时候 他就会将所有可配置的随机类型都提示出来了 有 整数 长整星 字符串 uuid 这里 我们来个模板 testcase:book:id: ${random.int}name: ${random.value}date: ${r…

数据库的多表查询(MYSQL)表表联立

根据以上三张表格&#xff0c;对三张表格进行不同的联立&#xff0c;查询并显示符合条件的内容。 1. 查出至少有一个员工的部门。显示部门编号、部门名称、部门位置、部门人数。 mysql> SELECT d.deptno AS 部门编号, d.dname as 部门名称, d.loc as 部门位置, COUNT(e.emp…

98.套接字-Socket网络编程1(基础概念)

目录 1.局域网和广域网 2.IP 互联网协议(Internet Protocol) IP的作用 3.查看IP地址 Windows上查看IP ​编辑 Linux上查看IP 4.端口 主要类型&#xff1a; 用途&#xff1a; 示例&#xff1a; 端口的表示&#xff1a; 5.OSI/ISO 网络分层模型 1.局域网和广域网 …