23 | 静态文件中间件:前后端分离开发合并部署骚操作

这里还有一个比较特殊的用法

一般情况下,我们前后端分离的架构,前端会编译成一个 index.html 文件和若干个 CSS 文件和 JavaScript 和图片文件

CSS 文件和 JavaScript 和图片文件一般会部署在 CDN 服务器上,这个 index 文件就需要我们建立一个宿主来 host 它

并且前端的一般路由的话,我们现在都会用 HTML5 的 History 的路由模式

这个时候前端就会对后端有一个特殊的诉求,除了 API 的请求以外,其他的请求的响应都应该是 index.html 这个静态文件

要达到这个目的,我们可以借助我们的中间件的执行原理来实现

首先假设我们的 index.html 就是我们前端编译好的静态文件,我们放置在 wwwroot 下面,前端编译的任何文件都放在 wwwroot 下面

然后我们再做一件事件就是 UseStaticFiles,我们把目录访问整个去掉

//services.AddDirectoryBrowser();

首先映射静态文件

app.UseStaticFiles();

静态文件映射出来之后实际上还有一个诉求,就是当我们访问其他特殊的页面地址的时候,比如说 /order/get 这样子的页面的时候,也应该响应我们的静态文件

这个时候我们可以把这样一段逻辑加入进来

// 判断我们当前的请求是否满足条件
app.MapWhen(context =>
{// 如果我们的请求不是以 API 开头的请求return !context.Request.Path.Value.StartsWith("/api");
}, appBuilder =>
{// 如果满足条件,我就走我下面这一段中间件的逻辑var option = new RewriteOptions();// 重写为 /index.htmloption.AddRewrite(".*", "/index.html", true);appBuilder.UseRewriter(option);// 重写完之后再使用我们的静态文件中间件appBuilder.UseStaticFiles();
});

这样子可以达到一个效果就是我们访问任意的非 API 目录的时候,我们都可以得到 index.html

启动程序

https://localhost:5001/api/weatherforecast

可以正常访问

API 的请求我们都是让它通过的,不是 API 的时候才会拦截

这个时候如果访问

https://localhost:5001/order

会发现获得的是静态文件

如果说静态文件是存在的,这个时候实际上会响应原有的静态文件,比如说访问

https://localhost:5001/a/index.html

这样子就可以发现我们能让静态文件的目录正常工作,并且能将其他的我们需要的地址都重定向到 index.html

当然这里还有另外一种写法,就是不用 UseRewriter 的方式,而是用 Run 的方式,也是就用断路器的方式

// 判断我们当前的请求是否满足条件
app.MapWhen(context =>
{// 如果我们的请求不是以 API 开头的请求return !context.Request.Path.Value.StartsWith("/api");
}, appBuilder =>
{如果满足条件,我就走我下面这一段中间件的逻辑//var option = new RewriteOptions();重写为 /index.html//option.AddRewrite(".*", "/index.html", true);//appBuilder.UseRewriter(option);重写完之后再使用我们的静态文件中间件//appBuilder.UseStaticFiles();appBuilder.Run(async c =>{// 读取静态文件,并且输出给我们的 Responsevar file = env.WebRootFileProvider.GetFileInfo("index.html");c.Response.ContentType = "text/html";using (var fileStream = new FileStream(file.PhysicalPath, FileMode.Open, FileAccess.Read)){await StreamCopyOperation.CopyToAsync(fileStream, c.Response.Body, null, BufferSize, c.RequestAborted);}});
});

这种写法有一个缺点就是,没办法像静态文件中间件那样,输出正确的 Http 请求头

对比一下两种方式的输出的请求头的不同

启动程序,访问

https://localhost:5001/order

打开调试工具,可以看到对 order 的我们的响应头就只有 4 个

其他的静态文件,响应头会多出来 etag,data,last-modified

这些的话就是我们关于 HTTP 缓存可以用到的头,所以说我们还是推荐使用上面这种方式,静态中间件的方式,而不是自己输出文件的方式

.NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(下)...相关推荐

  1. 【转】Vue.js入门教程(一)从静态页面到前后端分离开发

    第一章:基础知识 我能看懂吗? 只要你现在能用html+css+js制作一个静态页面,相信我,你100%可以读懂这篇文章. 本文尤其适合那些想要了解前后端分离开发技术,或者刚刚脱离传统MVC开发模式的 ...

  2. 《Vue+Spring Boot前后端分离开发实战》专著累计发行上万册

                杰哥的学术专著<Vue+Spring Boot前后端分离开发实战>由清华大学出版社于2021年3月首次出版发行,虽受疫情影响但热度不减,受到业界读者的热捧,截至今日 ...

  3. SpringBoot + Vue前后端分离开发:全局异常处理及统一结果封装

    SpringBoot + Vue前后端分离开发:全局异常处理及统一结果封装 文章目录 SpringBoot + Vue前后端分离开发:全局异常处理及统一结果封装 前后端分离开发中的异常处理 统一结果封 ...

  4. 笔记合并_.NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)学习笔记(上)...

    23 | 静态文件中间件:前后端分离开发合并部署骚操作 我们先来看一下静态文件中间件有哪些能力 1.支持指定相对路径 2.支持目录的浏览 3.支持设置默认文档 4.支持多目录映射 源码链接: http ...

  5. .NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(上)...

    23 | 静态文件中间件:前后端分离开发合并部署骚操作 我们先来看一下静态文件中间件有哪些能力 1.支持指定相对路径 2.支持目录的浏览 3.支持设置默认文档 4.支持多目录映射 源码链接: http ...

  6. 视频教程-SpringBoot2+Vue+AntV前后端分离开发项目实战-Java

    SpringBoot2+Vue+AntV前后端分离开发项目实战 10多年互联网一线实战经验,现就职于大型知名互联网企业,架构师, 有丰富实战经验和企业面试经验:曾就职于某上市培训机构数年,独特的培训思 ...

  7. 使用 imitator 实现前后端分离开发中的数据模拟与静态资源映射

    imitator 一个简单易用的 nodejs 服务器, 主要用于模拟 HTTP 接口数据, 请求代理与转发 . 使用imitator,可以解决前后端分离开发中的痛点之一:数据模拟,也可以作为代理服务 ...

  8. 视频教程-SpringBoot+Security+Vue前后端分离开发权限管理系统-Java

    SpringBoot+Security+Vue前后端分离开发权限管理系统 10多年互联网一线实战经验,现就职于大型知名互联网企业,架构师, 有丰富实战经验和企业面试经验:曾就职于某上市培训机构数年,独 ...

  9. 前后端分离开发模式下后端质量的保证 —— 单元测试

    概述 在今天, 前后端分离已经是首选的一个开发模式.这对于后端团队来说其实是一个好消息,减轻任务并且更专注.在测试方面,就更加依赖于单元测试对于API以及后端业务逻辑的较验.当然单元测试并非在前后端分 ...

最新文章

  1. ActiveMQ消息中间件简明笔记(1)——理论知识点整理
  2. 看本地网速_安装 ANSYS 本地帮助
  3. 【python图像处理】两幅图像的合成一幅图像(blending two images)
  4. 基于区域生长算法的图像分割python_图像分割中区域生长算法的程序设计与实现...
  5. xadmin与mysql数据库_十八、Django3.0学习之引入xadmin
  6. 图论中的基础概念总结
  7. HDU-1671 Phone List 暴力版 + 字典树
  8. sublime怎么配置python环境_在Sublime Editor中配置Python环境的详细教程
  9. ASP.NET DROPDOWNLIST无刷新联动(中文URL参数处理)
  10. DMA访问(直接内存访问)
  11. foremost文件删除恢复
  12. 程序大师的方天画戟 - vicc
  13. 微信小程序云数据库操作
  14. Web Uploader文件(图片)上传使用方法
  15. 2020年重磅喜讯!热烈祝贺王家林大咖人工智能及大数据领域经典著作《Apache Spark+AI全息代码解密》清华大学出版社发行上市!
  16. MySQL感悟_Mysql学习感悟
  17. jmeter里看java的log,jmeter中java协议请求
  18. 戴尔淘宝开旗舰店 与官网购买产品享受同样服务
  19. python绘制动态Julia集,超炫酷
  20. 网络摄像机(ip camera)安装设置步骤

热门文章

  1. 将字符串中的大写字母变成小写字母
  2. Could not find result map
  3. pixel 解锁_如何在Google Pixel 4和Pixel 4 XL上禁用面部解锁
  4. merge r语言daframe_R语言总结
  5. Asia Yokohama Regional Contest 2018 G题 What Goes Up Must Come Down(树状数组求逆序对)
  6. zabbix 3.0.0beta1安装-centos6.8版本
  7. Hadoop日常管理与维护
  8. Linux服务器数据备份
  9. Dell poweredge r210进BIOS修改磁盘控制器(SATA Controller)接口模式
  10. 医疗大数据:商业保险、移动医疗的崛起,正在形成闭环(二)