《深入浅出.NET框架设计与实现》阅读笔记(四)

静态文件系统


通过ASP.NET Core 提供的静态文件模块和静态文件中间件,可以轻松的让应用程序拥有访问静态文件的功能,同时可以基于IFileProvider对象来自定义文件系统,如基于Redis做扩展文件系统

启动静态文件服务

Program.cs 类中,通过WebApplication的UseStaticFiles扩展方法启动。

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseStaticFiles();
app.Run();

默认存储目录(wwwroot)

默认情况下,静态文件存储在项目的wwwroot目录下。
在这里插入图片描述

  • 读取静态文件(以favicon.ico文件为例):https:// localhost:6379/favicon.ico
  • 读取静态文件(以README.md文件为例):https://localhost:6379/css/open-iconic/README.md

增加自定义静态目录文件

  • 调用UseStaticFiles方法时传递StaticFileOptions配置参数。
  • StaticFileOptionsFileProvider为指定的文件夹路径
  • StaticFileOptionsRequestPath为请求路径的前缀
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
//自定义静态文件目录
StaticFileOptions fileOpt = new()
{FileProvider = new PhysicalFileProvider(Path.Combine(builder.Environment.ContentRootPath, "MyStaticFiles")),//指定文件夹目录RequestPath = "/StaticFiles"//自定义前缀
};
app.UseStaticFiles(fileOpt);
app.Run();
  • 指定了在项目文件目录下的MyStaticFiles文件夹
    在这里插入图片描述
  • 通过路径来获取想要的文件(以用户手册.pdf为例):https://localhost:6379/StaticFiles/用户手册.pdf
    在这里插入图片描述

自定义一个简单的文件系统

在ASP.NET Core中,允许开发人员自定义文件系统,可以利用IFileProvider接口来构建文件系统。

文件信息类(RedisFileInfo)

public class RedisFileInfo : IFileInfo
{/// <summary>/// 判断目录或文件是否真的存在/// </summary>public bool Exists { get; set; } = true;/// <summary>/// 表示是目录还是文件/// </summary>public bool IsDirectory { get; set; }/// <summary>/// 文件或目录最后一次修改的时间/// </summary>public DateTimeOffset LastModified { get; set; }/// <summary>/// 表示文件内容的字节长度/// </summary>public long Length => _fileContent.Length;/// <summary>/// 表示文件或目录的名字/// </summary>public string Name { get; set; }/// <summary>/// 表示文件或目录的物理路径/// </summary>public string PhysicalPath { get; set; }private readonly byte[] _fileContent;public Stream CreateReadStream(){var stream = new MemoryStream(_fileContent);stream.Position = 0;return stream;}public RedisFileInfo() { }public RedisFileInfo(string name, string content){Name = name;LastModified = DateTimeOffset.Now;_fileContent = Convert.FromBase64String(content);}public RedisFileInfo(string name,bool isDirectory){Name = name;LastModified = DateTimeOffset.Now; IsDirectory = isDirectory;}}

文件目录类(EnumerableDirectoryContents)

public class EnumerableDirectoryContents : IDirectoryContents
{private readonly IEnumerable<IFileInfo> _entries;public bool Exists => true;public EnumerableDirectoryContents(IEnumerable<IFileInfo> entries){_entries = entries;}public IEnumerator<IFileInfo> GetEnumerator(){return _entries.GetEnumerator();}IEnumerator IEnumerable.GetEnumerator(){return GetEnumerator();}
}

Redis配置文件(RedisFileOptions)

public class RedisFileOptions
{/// <summary>/// 配置Redius连接信息/// </summary>public string HostAndPort { get; set; }
}

文件系统逻辑处理类(RedisFileProvider)

    /// <summary>/// Redis文件解析器,只要用于通过指定的名称从Redis中读取存储的图片内容/// </summary>
public class RedisFileProvider : IFileProvider
{private readonly RedisFileOptions _options;private readonly ConnectionMultiplexer _redis;private static string NormalizePath(string path) => path.TrimStart('/').Replace('/', ':');/// <summary>/// 参数为Ioptions的好处是可以使用Options.Create()方法来直接生成/// </summary>/// <param name="options"></param>public RedisFileProvider(IOptions<RedisFileOptions> options){_options = options.Value;_redis = ConnectionMultiplexer.Connect(new ConfigurationOptions{EndPoints = { _options.HostAndPort }});}/// <summary>/// 获得指定的目录/// /// 通过/// </summary>/// <param name="subpath"></param>/// <returns></returns>/// <exception cref="NotImplementedException"></exception>public IDirectoryContents GetDirectoryContents(string subpath){var db = _redis.GetDatabase();var server = _redis.GetServer(_options.HostAndPort);var list = new List<IFileInfo>();subpath = NormalizePath(subpath);foreach (var key in server.Keys(0, $"{subpath}*")){var k = "";if (subpath != "") k = key.ToString().Replace(subpath, "").Split(":")[0];else k = key.ToString().Split(":")[0];if (list.Find(f => f.Name == k) == null){//判断是否存在.if (k.IndexOf('.', StringComparison.OrdinalIgnoreCase) >= 0){list.Add(new RedisFileInfo(k, db.StringGet(k)));}else{list.Add(new RedisFileInfo(k, true));}}}if (list.Count == 0){return NotFoundDirectoryContents.Singleton;}return new EnumerableDirectoryContents(list);}/// <summary>/// 得到指定目录或文件的IFileInfo对象/// 通过subpath参数值再Redis客户端读取文件信息。/// </summary>/// <param name="subpath"></param>/// <returns></returns>/// <exception cref="NotImplementedException"></exception>public IFileInfo GetFileInfo(string subpath){subpath = NormalizePath(subpath);var db = _redis.GetDatabase();var redisValue = db.StringGet(subpath);return !redisValue.HasValue ? new NotFoundFileInfo(subpath) : new RedisFileInfo(subpath, redisValue.ToString());}public IChangeToken Watch(string filter){throw new NotImplementedException();}
}

注入服务

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
//使用自定义文件系统
StaticFileOptions fileOpt = new()
{FileProvider = new RedisFileProvider(Options.Create(new RedisFileOptions{HostAndPort = "localhost:6379",}))
};
app.UseStaticFiles(fileOpt);

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

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

相关文章

image J 对Western blot 条带进行灰度分析 量化分析

用ImageJ对条带进行定量分析 | Public Library of Bioinformatics (plob.org) 3分钟Get&#xff01;大牛教你用 image J 对Western blot 条带进行灰度分析&#xff01; - 哔哩哔哩 (bilibili.com) 科研人员做的western blot实验一般需要对其结果扫描后进行灰度分析&#xff0…

34 mysql limit 的实现

前言 这里来看一下 我们常见的 mysql 分页的 limit 的相的处理 这个问题的主要是来自于 之前有一个需要处理 大数据量的数据表的信息, 将数据转移到 es 中 然后就是用了最简单的 “select * from tz_test limit $pageOffset, $pageSize ” 来分页处理 但是由于 数据表的数…

人工智能基础_机器学习033_多项式回归升维_多项式回归代码实现_非线性数据预测_升维后的数据对非线性数据预测---人工智能工作笔记0073

然后我们来实际的操作一下看看,多项式升维的作用,其实就是为了,来对,非线性的数据进行拟合. 我们直接看代码 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression X=np.linspace(-1,11,num=100) 从-1到11中获取100个数…

计算机视觉基础(6)——光流估计

前言 本章我们来学习一下图像处理基础中的运动估计。主要内容包括运动场估计和光流估计两个部分。在运动场估计中&#xff0c;我们将学习到运动场、光流、光流和运动场的区别&#xff1b;在光流估计中&#xff0c;我们将学习到光流估计任务、孔径问题&#xff0c;以及光流估计两…

Jenkins Docker Swarm插件 配置的坑

配置 Docker Host URI 注意&#xff0c;这里要用 http://&#xff01;&#xff01;&#xff01;如果按照提示里用了 tcp:// 则会报错&#xff0c;异常信息如下&#xff1a; 2023-11-13 16:28:42.6830000 [id34] WARNING o.e.j.s.h.ContextHandler$Context#log: Error while s…

美国站群服务器IP如何设置分配?

​  在配置美国站群服务器时&#xff0c;IP的分配是一个重要的步骤。下面将介绍一些关于美国站群服务器IP分配的相关知识。 独享IP和虚拟IP 在租用美国站群服务器之前&#xff0c;我们需要了解提供的IP是独享的还是虚拟的。独享IP指每个网站都有独立的IP地址&#xff0c;而虚…

Android Studio的代码笔记--JSON解析学习2

JSON学习2 生成JSON解析JSON java解析json字符串和合成json字符串 json字符串 {"type":"getConfig","ip":"192.168.1.100"}使用 String ss groupJS("Config","192.168.1.100"); splitJS(ss);回显 I/lxh: group…

(一)什么是Vite——vite介绍与使用

什么是Vite Vite&#xff08;法语意为 "快速的"&#xff0c;发音 /vit/&#xff0c;发音同 "veet"&#xff09;是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验。 它主要由两部分组成&#xff1a; 一个开发服务器&#xff0c;它基于 原生 …

Kohana框架的安装及部署

Kohana框架的安装及部署 tipsKohana安装以及部署1、重要文件作用说明1.1 /index.php1.2 /application/bootstrap.php 2、项目结构3、路由配置3.1、隐藏项目入口的路由3.2、配置默认路由3.3、配置自定义的路由(Controller目录下的控制器)3.4、配置自定义的路由(Controller/direc…

数据同步工具调研选型:SeaTunnel 与 DataX 、Sqoop、Flume、Flink CDC 对比

产品概述 Apache SeaTunnel 是一个非常易用的超高性能分布式数据集成产品&#xff0c;支持海量数据的离线及实时同步。每天可稳定高效同步万亿级数据&#xff0c;已应用于数百家企业生产&#xff0c;也是首个由国人主导贡献到 Apache 基金会的数据集成顶级项目。 SeaTunnel 主…

通过右键用WebStorm、Idea打开某个文件夹或者在某一文件夹下右键打开当前文件夹用上述两个应用

通过右键用WebStorm、Idea打开某个文件夹或者在某一文件夹下右键打开当前文件夹用上述两个应用 通过右键点击某个文件夹用Idea打开 首先打开注册表 win R 输入 regedit 然后找到HKEY_CLASSES_ROOT\Directory\shell 然后右键shell 新建一个项名字就叫 Idea 第一步&#xf…

MVC使用的设计模式

MVC使用的设计模式 一、背景 MVC模式是"Model-View-Controller"的缩写&#xff0c;中文翻译为"模式-视图-控制器"。MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View&#xff0c;或者同时改变两者。只要Controller改变了Model…