# 1. GIT的基礎使用
使用Source Tree操作。
----
## 1.1. SourceTree安裝
至[SourceTree](https://www.sourcetreeapp.com/)官網下載。
SourceTree安裝檔附帶Git安裝,所以不用額外下載。
----
### 1.1.1. 步驟一
安裝第一步驟可以直接點選**Skip**略過登入Bitbucket服務。

----
### 1.1.2. 步驟二
在選擇安裝項目中必定將**Git**項目勾選。

----
### 1.1.3. 步驟三
安裝完成。

----
### 1.1.4. 步驟四
設定Git使用者資訊。

----
### 1.1.5. 步驟五
接下來選擇是否匯入SSH Key,這個範例中先選擇No略過。

----
## 1.2. SourceTree與Git的使用
----
### 1.2.1. 建立Repository
點選工具列的**Create**,依照表單要求資訊輸入後點選**Create**按鈕。

----
### 1.2.2. 設定.gitignore
專案有許多無須加入版控的檔案,如`dll`檔案或`node_module`目錄,可透過`.gitignore`在git略過這些檔案。
在GitHub中的[github/gitignore](https://github.com/github/gitignore),其中包含了大多數常用的.gitignore設定檔。

----
### 1.2.3. 手動將檔案加入.gitignore
在SourceTree中切換至`WORKSPACE/File Status`,在要略過的項目點右鍵選擇`Ignore`。

----
在`Ignore`設定視窗中選擇`Ignore exact filename(s)`,或依自己需求調整。

----
### 1.2.4. 加入Origin
首先選擇`Settings`後選擇`Remotes`標籤,最後點選`Add`。

----
取得Git Server的Repository URL。

----
在`Required Information`選項中點選Default remote並設定URL。點選OK。

----
完成。

----
### 1.2.5. 初始化Git Flow
由於剛建立的Repository沒有第一個commit起始點,所以執行以下指令建立起使commit。
```bash
git commit -m "init" --allow-empty
```
----
點選`Git-flow`按鈕,之後直接點選OK。

----
完成。

### 1.2.6. 建立Commit
在File Status標籤中將Unstaged的項目移動至Staged中,並在Commit message輸入本次修改的意圖,選擇Commit。

----
### 1.2.7. Pull & Push
點選Push按鈕,勾選要推至Git Server的分支。

----
## 1.3. Git Flow

---
# 2. HTTP Methods
## 2.1. GET
最常見的行為,如瀏覽器輸入網址後瀏覽的行為。
幂等,每次請求客戶端接收結果應該一樣。
----
## 2.2. POST
可以用於建立與上傳行為。
非幂等,每次請求狀態不一。
----
## 2.3. PUT
用於更新資料與上傳行為。
幂等,每次請求客戶端接收結果應該一樣。
----
## 2.4. DELETE
常用於刪除資源。
非幂等,每次請求狀態不一。
----
## 2.5. RESTful
REST 介面有三要素:
1. 名詞(Noun): 操作資源,像是https://xxx/api/User/user1。
2. 動詞(Verb): 操作指令,包含GET、POST、PUT、DELETE。
3. 表徵(Content Type):內容格式,像HTML。
> 參考自: https://medium.com/@jinghua.shih/%E7%AD%86%E8%A8%98-rest-%E5%88%B0%E5%BA%95%E6%98%AF%E4%BB%80%E9%BA%BC-170ad2b45836
---
# 3. ASP.NET Core

----
## 3.1. Dependencty Injection
在ASP.NET Core專案中的Startup Class中的`ConfigureServices`區塊為定義DI項目用途。
```csharp
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<ClassA>();
services.AddScoped<ClassB>();
services.AddSingleton<ClassC>();
services.AddMvc();
}
```
----
在ASP.NET Core中的DI容器提供以下三種注入項目的生命週期
1. Transient: 瞬態,每次向DI提供者取得都會重新產生。
2. Scoped: 範圍,在ASP.NET Core中表示為一個Request至Response週期。
3. Singletion: 單例,整個應用程式中都共用同一個物件實例。
----

參考自: https://blog.johnwu.cc/article/ironman-day04-asp-net-core-dependency-injection.html
----
## 3.2. Pipeline & Middleware

----
在Startup Class的Configure方法定義Http Request至Http Response的整個流程。先進後出。

----
常見的幾個Pipeline定義有以下幾個:
1. Use: pipeline的過程
3. Run: pipeline的終點
4. Map: 使用路由作為pipeline分岔依據
5. MapWhen: 使用條件作為pipeline分岔依據
----
## 3.3. Static Files
```csharp
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 使用狀態碼導引,如發生404則導引到/404.html
app.UseStatusCodePagesWithRedirects("/{0}.html");
// 若未指定檔案名稱則預設使用index.html
app.UseDefaultFiles();
// 讀取wwwroot目錄內的檔案
app.UseStaticFiles();
}
```
----
## 3.4. Configuration
在Startup中若需要讀取appsettings.json的設定,則可以在Startup建構式中加入`IConfiguration`類型的參數,並將其儲存至屬性如下:
```csharp
public class Startup
{
public IConfiguration Configuration{get;private set;}
public Startup(IConfiguration config){
Configuration = config;
}
}
```
----
```json
{ "ConnectionStrings":{ "Default": "xxxxx" } }
```
若再設定DI或Pipeline中使用Configuration的參數,如要讀取其中的ConnectionStrings則可以如下兩種方法獲取。
```csharp
Configuration.GetConnectionStrings("Default");
Configuration["ConnectionStrings:Default"];
```
----
## 3.5. SPA Routing
若網站為SPA,路由為ASP.NET Core負責,再對SPA的路由需要將404回應index.html的內容,以便S獲取路由。
```csharp
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.Use(async (context, next) =>
{
await next();
if (context.Response.StatusCode == 404) // 當404時,將原有Request路徑複寫重試
{
context.Request.Path = "/";
await next();
}
});
//app.UseStatusCodePagesWithReExecute("/"); //也可以直接使用這個方式
app.UseDefaultFiles();
app.UseStaticFiles();
}
```
----
## 3.6. Cookies & Session
使用Cookies與Session可以用來簡單的儲存使用者狀態或登入狀態等。
在使用Cookies時並不需要額外加入DI項目,直接於Middleware或HttpContext中調用Request或Response的Cookies屬性即可進行讀取與寫入操作。
----
```csharp
app.Run(async (context) =>
{
if (context.Request.Cookies.TryGetValue("Test", out string testValue))
{
context.Response.Cookies.Append("Test", testValue + "x", new CookieOptions()
{
HttpOnly = true,
Expires = DateTimeOffset.Now.AddDays(1)
});
}
else
{
context.Response.Cookies.Append("Test", "x", new CookieOptions()
{
HttpOnly = true,
Expires = DateTimeOffset.Now.AddDays(1)
});
}
});
```
----
若是要使用Session,則需補充以下兩個DI項目:
```csharp
services.AddDistributedMemoryCache(); // 加入InMemory的分散式快取
services.AddSession(); // 加入Session服務
```
----
加入DI項目後再Pipeline的範例如下:
```csharp
app.UseSession(); // 這個Middleware之後才可用Session服務
app.Use(async (context, next) =>
{
context.Session.SetString("TEST", "AAAA"); // 寫入Session
await next();
});
```
---
## 3.7. 站台發佈
首先在要發佈的WEB專案點選右鍵/發佈

我們先選擇資料夾的形式發行
----
使用預設路徑

----

----
### 3.7.1 自封裝
在某些形況下希望可以讓EndUser可以在不附加在IIS運行WEB服務,而不需要另外安裝.NET Core環境,這時候可以將整個WEB封裝獨立運行。

----
以上述步驟產生的程式檔案中的dll數量繁多,使用者要在其中找到exe檔案稍嫌麻煩。
而在.NET Core 3中提供選項可以將眾多DLL與EXE封裝在同一個EXE中。

----
### 3.7.2 IIS
若要將ASP.NET Core佈署於IIS上,則該SERVER需要安裝IIS的擴充(ASP.NET Core Module)。之後可以將帶有web.config的編譯結果直接放上去。

----
#### 3.7.2.1 在IIS上的異常排除
----
#### 3.7.2.2 掛載子應用程式
----
## 3.8. EntityFrameworkCore
---
# 4. ASP.NET Core MVC
----
## 4.1. 建立Controller與基本的RESTful API
----
## 4.2. MVC Action路由
----
## 4.3. 建立View與View的載入順序
----
## 4.4. View的Layout
----
## 4.5. 基本的Razor語法
----
## 4.6. 常見的ActionResult類型
----
## 4.7. 搭配EntityFrameworkCore撰寫API
----
## 4.8. 搭配EntityFrameworkCore撰寫View
----
## 4.9. MVC使用Session做登入驗證
----
## 4.10. RESTful API使用JWT做登入驗證
### 4.10.1. 什麼是JWT
### 4.10.2. 簽發JWT
### 4.10.3. 驗證JWT
### 4.10.4. 綁定Action驗證
{"metaMigratedAt":"2023-06-15T15:29:40.138Z","metaMigratedFrom":"Content","title":"1. GIT的基礎使用","breaks":true,"contributors":"[{\"id\":\"4d83bade-1491-4c31-9dd5-b3121c075f83\",\"add\":7688,\"del\":573}]"}