如何在ASP.NET Core中自定义Azure Storage File Provider
主题:如何在ASP.NET Core中自定义Azure Storage File Provider
作者: Lamond Lu
地址: https://www.cnblogs.com/lwqlun/p/10406566.html
项目源代码: https://github.com/lamondlu/AzureFileProvider
背景
ASP.NET Core是一个扩展性非常高的框架,开发人员可以根据自己的需求扩展出想要的功能。File Provider是ASP.NET Core中的一个重要组件,通过这个组件,开发人员可以暴露一组文件,并允许应用程序像访问静态文件一样访问暴露的文件。
ASP.NET Core中内置了3种File Provider
PhysicalFileProvider
- 用来访问和应用程序部署在一起的静态文件ManifestEmbeddedFileProvider
- 用来访问程序集中的内嵌文件CompositeFileProvider
- 将多个File Provider合并使用
那么如何自定义一个File Provider呢?比如如何将Azure Files Storage中的文件暴露给ASP.NET Core应用程序。今天我们来演示一下,如果通过实现IFileProvider
接口来实现一个Azure Files Storage Provider。
本文中只针对Azure Files Storage, Azure Blob Storage的实现可以参见Filip w的博文
创建.NET Core Library项目
首先我们使用Visual Studio 2017,创建一个Class Library项目, 命名为AzureFileProvider
为了使用IFileProvider
接口和Azure Storage服务,这里我们需要使用Nuget引入2个库
Microsoft.AspNetCore.App
WindowsAzure.Storage
创建AzureFileProvider
为了创建一个ASP.NET Core支持的File Provider, 我们就需要自己创建一个类,并让它实现IFileProvider
接口。
这里首先我们创建一个类AzureFileProvider
, 它实现了IFileProvider
接口
从以上代码中,我们可以了解到,IFileProvider
接口定义了3个需要实现方法
GetDirectoryContents
- 这个方法是用来获取指定目录下的内容的GetFileInfo
- 这个方法使用来获取指定文件内容的Watch
- 这个方法是用来监听文件变更的,这个暂时不需要实现它
实现GetDirectoryContents
方法
为了实现GetDirectoryContents
方法,我们需要首先创建一个IDirectoryContents
接口的实现类, 因为它是这个方法的返回类型。
我们创建一个类AzureStorageDirectoryContents
, 它实现了IDirectoryContents
接口。
代码解释:
这里
IDirectoryContents
其实就是为了显示指定目录中的文件结构
IFileInfo
接口对象既可以表示文件也可以表示子目录,这个接口的2个实现我会在后面说明这里我们通过构造函数,将指定文件夹内的文件结构注入到了
AzureStorageDirectoryContents
雷中。
下面我们就可以来添加GetDirectoryContents
方法的实现了。
代码解释:
这里我们通过构造函数为
AzureFileProvider
类注入了一个Azure Files Storage强类型配置类AzureStorageSetting
, 它的数据源是appSettings.json, 后续我们会通过强类型配置将其注入
GetRootDirectory
方法是通过Azure Files Storage配置,获得Azure Files Storage中文件集合的根目录
GetDirectoryContents
中subpath.Substring(1)
代码的作用是去除subpath带的第一个“/”。如果不去除,会读取不到文件这里我们使用了
ListFilesAndDirectoriesSegmentedAsync
方法获取了指定目录中所有的文件和目录如果是文件,我们会实例化一个
AzureFileInfo
对象,如果是一个目录,我们会实例化一个AzureDirectoryInfo
对象最终我们将读取到的所有文件和目录信息通过
AzureStorageDirectoryContents
类的构造函数注入。
创建AzureFileInfo
和AzureDirectoryInfo
为了区分文件和目录,我们创建2个新类AzureFileInfo
和AzureDirectoryInfo
。 他们都实现了IFileInfo
接口。
AzureFileInfo
代码解释
这里我们通过
AzureFileInfo
的构造函数传入了一个CloudFile
对象, 这个对象将作为Name
,PhysicalPath
,LastModified
等属性的数据源。我们使用
CloudFile
对象DownloadRangeToStreamAsync
, 将其对应的文件流下载。注意这里加载文件流之后,需要将文件流的Position置0(即流的头部)文件的长度即文件流的长度
强制设置
IsDirectory
属性为false, 因为当前处理的是文件
AzureDirectoryInfo
代码解释
这里我们通过
AzureDirectoryInfo
的构造函数传入了一个CloudFileDirectory
对象, 这个对象将作为Name
,PhysicalPath
,LastModified
等属性的数据源。强制设置
IsDirectory
属性为true, 因为当前处理的是目录这里我们没有实现
Length
属性和CreateReadStream
, 因为我们处理的是目录, 这2个属性没有必要实现。
实现GetFileInfo
方法
相对于GetDirectoryContents
方法的实现,GetFileInfo
方法就简单多了,我们只需要根据当前指定的subpath, 将文件信息返回即可。
如何启用AzureFileProvider
下面我们来试验一下我们编写的AzureFileProvider是否能运行成功。
首先我们创建一个默认ASP.NET Core Api项目,并引用上一步中编译好的程序集AzureFileProvider.dll。
appSettings.json中, 我们需要定义Azure Files Storage的配置
例:
第二步,我们需要修改Startup.cs
文件的Configure
方法。
代码解释
这里我们使用强类型配置绑定,获取了appSettings.json中的Azure Files Storage的配置
在配置静态文件中间件部分,我们通过
StaticFileOptions
配置对象,指定了当前应用使用AzureFileProvider。为了演示效果,我这里也启用了DirectoryBrowser中间件,即可以使用网页查看目录结构。这个功能比较危险,在正式项目很少使用。所以正式使用时,最好将这段代码删掉。
最终效果
现在我们启动当前项目, 访问"/files", 即可查看到当前指定Azure Files Storage中的所有文件和目录
项目源代码
https://github.com/lamondlu/AzureFileProvider
Nuget程序集
以上类库,我已经发布到了Nuget上, 如果你不想每次都把前面的代码写一遍,可以直接安装这个程序集来使用。
Install-Package LamondLu.AzureFileProvider
如何在ASP.NET Core中自定义Azure Storage File Provider相关推荐
- asp绑定gridview属性_如何在ASP.NET Core中自定义Azure Storage File Provider
主题:如何在ASP.NET Core中自定义Azure Storage File Provider 作者: Lamond Lu 地址: https://www.cnblogs.com/lwqlun/ ...
- 如何在ASP.NET Core中使用Azure Service Bus Queue
原文:USING AZURE SERVICE BUS QUEUES WITH ASP.NET CORE SERVICES 作者:damienbod[1] 译文:如何在ASP.NET Core中使用Az ...
- 如何在 ASP.NET Core 中 自定义中间件
ASP.NET Core 是一个跨平台,开源的,轻量级,高性能 并且高度模块化的web框架,同时扩展性也是非常强,你可以在 request -> response 请求管道中安插各种中间件来根据 ...
- 如何在ASP.NET Core中编写自定义日志记录提供程序
目录 介绍 如何实现所需的接口 基础类和附件 FileLoggerProvider具体类及其附件 1. ConfigureLogging() 2. appsettings.json文件 介绍 源代码可 ...
- 如何在 ASP.NET Core 中使用 HttpClientFactory ?
ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory. ...
- 如何在 ASP.Net Core 中使用 Autofac
依赖注入可以有效的实现对象之间的 松耦合 并能够实现代码的可测试和可维护性,ASP.Net Core 提供了一个极简版的容器实现对 依赖注入 的原生支持,然而内置的依赖注入容器相比成熟的 依赖注入容器 ...
- 如何在 ASP.Net Core 中对接 WCF
在 REST API 出现之前,SOAP (Simple Object Access Protocol) 一直都是基于 web 的标准协议,虽然现在 REST 大行其道,但在平时开发中总会遇到对接第三 ...
- 如何在 ASP.Net Core 中使用 Configuration Provider
ASP.NET Core 是一个开源的,跨平台的,精简的模块化框架,可用于构建高性能,可扩展的web应用程序, ASP.NET Core 中的数据配置常用 k-v 的形式存储,值得注意的是,新的数据配 ...
- 如何在 ASP.NET Core 中使用 URL Rewriting 中间件
URL rewriting 是根据预先配置好的一组规则去修改 request url,值得注意的是:URL Rewriting 的重写功能和 url 重定向 是两个概念,本篇我们就来讨论下如何在 AS ...
最新文章
- 转:SAP 零售业POS心得分享
- IBM informix .net provider
- SAP Spartacus cxFocus的config属性的赋值原理
- TCP/UDP 网络编程实例
- PyTorch 1.0 中文官方教程:词嵌入:编码形式的词汇语义
- 在Linux命令行发送电子邮件附件的两种方法
- 有关《家》的经典歌曲_【经典】50首诗词,做成50首歌曲,够你享受一整年!(收藏了慢慢听)...
- 给快播指一条生路:转型会员付费吧
- 鸿蒙系统如何设置隐私,安卓12系统首次露面:加强隐私功能,一个设定大受好评...
- 关于flash强制更新:早上上班,多台电脑提示未安装flash
- 知乎App加密流量分析初探
- 台式计算机文件打不开怎么回事,电脑文件打不开是怎么回事 电脑Word文档打不开怎么处理...
- 第一次用计算机证明的数学定理是,勾股定理是一个基本几何定理,是人类早期发现并证明的重要数学定理之一,用代数思想解决几何...
- outlook不断弹出“对以下服务器输入您的用户名和密码”
- 一,用户操作过程中token过期了怎么续上?
- 记网站部署中一个奇葩BUG
- STC12C5A60S2单片机WIFI信号扫描报警监视系统信号增强信号过低报警
- c++读取文件夹下面的图片名称
- Linux中图形用户界面与命令行模式互相切换
- 小学三年级计算机上册课后反思,三年级上册数学教学反思