.NET Core开发实战(第23课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(下)...
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课:静态文件中间件:前后端分离开发合并部署骚操作)--学习笔记(下)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Ocelot中使用自定义的中间件(一)
- 下一篇: 如何编写高性能的C#代码(四)字符串的另