ASP.NET Core 2 學習筆記(五)

来源:https://www.cnblogs.com/snaildev/archive/2018/05/25/9087442.html
-Advertisement-
Play Games

之前的ASP.NET網站,只要把*.html、*.css、*.jpg、*.png、*.js等靜態文件放在項目根目錄,預設都可以直接被瀏覽;但ASP.NET Core 小改了瀏覽靜態文件的方式,預設根目錄不再能瀏覽靜態文件,需要指定靜態文件的目錄,才可以被瀏覽。本篇將介紹ASP.NET Core瀏覽靜 ...


之前的ASP.NET網站,只要把*.html*.css*.jpg*.png*.js等靜態文件放在項目根目錄,預設都可以直接被瀏覽;但ASP.NET Core 小改了瀏覽靜態文件的方式,預設根目錄不再能瀏覽靜態文件,需要指定靜態文件的目錄,才可以被瀏覽。
本篇將介紹ASP.NET Core瀏覽靜態文件的方法。

試著在項目根目錄及wwwroot目錄中加入靜態文件,例如:

項目根目錄\index.html

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>MyWebsite</title>
</head>
<body>
    項目根目錄的 index.html
</body>
</html>

項目根目錄\wwwroot\index.html

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>MyWebsite</title>
</head>
<body>
    wwwroot目錄的 index.html
</body>
</html>

然後在網址欄輸入:

  • http://localhost:5000/index.html
  • http://localhost:5000/wwwroot/index.html
    會發現以上兩個鏈接都沒有辦法打開index.html。

瀏覽靜態文件,需要Microsoft.AspNetCore.StaticFiles中間件,ASP.NET Core 2.0以上版本預設包含。

啟用靜態文件

Startup.csConfigureIApplicationBuilder使用UseStaticFiles方法註冊靜態文件的Middleware:

Startup.cs

// ...
public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.UseStaticFiles();

        // ...
        
        app.Run(async context =>
        {
            await context.Response.WriteAsync("Hello World! \r\n");
        });
    }
}

UseStaticFiles預設啟用靜態文件的目錄是wwwroot,設定完成後再次嘗試開啟URL:

  • http://localhost:5000/index.html
    開啟的內容會是:wwwroot目錄的index.html
  • http://localhost:5000/wwwroot/index.html
    依然無法顯示靜態文件。

UseStaticFiles註冊的順序可以在外層一點,比較不會經過太多不必要的Middleware。如圖:

當Requset的URL文件不存在,則會轉向到Run的事件(如灰色箭頭)。

變更網站目錄

預設網站目錄是wwwroot,如果想要變更此目錄,可以在Program.cs的WebHost Builder用UseWebRoot設置網站預設目錄。
例如:把預設網站目錄wwwroot改為public,如下:

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;

namespace MyWebsite
{
    public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseWebRoot("public")
                .UseStartup<Startup>()
                .Build();
    }
}

啟用指定目錄

由於UseStaticFiles只能拿到預設文件夾底下的文件,某些情況會需要特定目錄也能使用靜態文件。
例如:用npm安裝的第三方庫都放在項目目錄底下的node_modules。

Startup.cs

// ...
public class Startup
{
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseStaticFiles();
        app.UseStaticFiles(new StaticFileOptions()
        {
            FileProvider = new PhysicalFileProvider(
                Path.Combine(env.ContentRootPath, @"node_modules")),
            RequestPath = new PathString("/third-party")
        });
        // ...
    }
}

以上設定就會把URL http://localhost:5000/third-party/example.js指向到項目目錄\node_modules\example.js

預設文件

比較友好的用戶體驗會希望http://localhost:5000/可以自動指向到index.html。
能通過UseDefaultFiles設定靜態文件目錄的預設文件。

Startup.cs

// ...
public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.UseDefaultFiles();
        app.UseStaticFiles();
        // ...
    }
}
  • UseDefaultFiles的職責是嘗試請求預設文件。
  • UseStaticFiles 的職責是回傳請求的文件。

UseDefaultFiles必須註冊在UseStaticFiles之前。
如果先註冊UseStaticFiles,當URL是/時,UseStaticFiles找不到該文件,就會直接回傳找不到;所以就沒有機會進到UseDefaultFiles

自定義預設文件

UseDefaultFiles的預設文件如下:

  • default.htm
  • default.html
  • index.htm
  • index.html

如果預設文件的文件名不在上列清單,也可以自定義要用什麼名稱當作預設文件。
通過DefaultFilesOptions設定後,傳入UseDefaultFiles

Startup.cs

// ...
public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        var defaultFilesOptions = new DefaultFilesOptions();
        defaultFilesOptions.DefaultFileNames.Add("custom.html");
        app.UseDefaultFiles(defaultFilesOptions);
        app.UseStaticFiles();
        // ...
    }
}

文件清單

基本上為了網站安全性考量,不應該讓使用者瀏覽伺服器上面的文件清單,但如果真有需求要讓使用者瀏覽文件清單也不是不行。

Startup.csConfigureIApplicationBuilder使用UseFileServer方法註冊文件伺服器的功能:

Startup.cs

// ...
public class Startup
{
    // ...
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseFileServer(new FileServerOptions()
        {
            FileProvider = new PhysicalFileProvider(
                Path.Combine(env.ContentRootPath, @"bin")
            ),
            RequestPath = new PathString("/StaticFiles"),
            EnableDirectoryBrowsing = true
        });
    }
}

當打開http://localhost:5000/StaticFiles時,就指向到項目目錄\bin\目錄,並且可以直接瀏覽文件目錄及文件內容,如下: 

參考

 Working with static files in ASP.NET Core

 

老司機發車啦:https://github.com/SnailDev/SnailDev.NETCore2Learning


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • PHP匿名函數和閉包 匿名函數[官方文檔][2] 本篇文章的代碼測試使用的是[php線上測試工具][1]5.6 匿名函數 匿名函數就是沒有定義函數名的函數,php從5.3版本開始支持匿名函數 php ...
  • #coding:utf-8import random,stringdef GetPassword(length): # 隨機生成數字個數 Ofnum=random.randint(1,length) Ofletter=length-Ofnum # 選中ofnum個數字 slcNum=[random. ...
  • 隱藏圖不是什麼新鮮的東西,具體表現在大部分社交軟體中,預覽圖看到的是一張圖,而點開後看到的又是另一張圖。雖然很早就看到過這類圖片,但是一直沒有仔細研究過它的原理,今天思考了一下,發現挺有趣的,所以自己也寫了個簡單的演算法把兩張圖片合成為一張隱藏圖。 比如下麵這張圖。 當背景顏色為白色時,通常也就是在預 ...
  • 準備工作: 建立.NET Core Web Api項目 新建一個用於Api請求的UserInfo類 2、建立.NET Core Web項目 一、使用jQuery Ajax訪問 (一)、表單 [FromForm] 數據類型:Object ContenyType類型:application/x-www- ...
  • 這是一個ASP.NET Core2.0專題文章列表 ...
  • using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.... ...
  • 根據自己項目的開發需要,整理了一個SqlHelper類 相比較網上通用的SqlHelper類方法主要有一下幾點的不同: 1.因為要操作多個資料庫,所以資料庫連接字元串沒有寫死到方法里,作為參數提供出來。 2.因為涉及到多表多庫的操作,涉及到資料庫級別的事物,以及邏輯業務上的事物,因此,要從最基元的部 ...
  • 警告 載入屬性“OutputPath”失敗。 輸入的路徑不是有效的輸出路徑。 解決方案: 先項目打包備份一下哦,再執行以下操作哦。 1.右鍵項目屬性, 發佈,發佈位置修改成 publish\ 生成 ,輸出路徑修改成 bin\Debug\ 2.打開項目所在的文件夾,找到一個尾碼名 .csproj的文件 ...
一周排行
    -Advertisement-
    Play Games
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...
  • 1. JUnit 最佳實踐指南 原文: https://howtodoinjava.com/best-practices/unit-testing-best-practices-junit-reference-guide/ 我假設您瞭解 JUnit 的基礎知識。 如果您沒有基礎知識,請首先閱讀(已針 ...