跳到主要內容

發表文章

目前顯示的是 7月, 2018的文章

淺談HTTP的快取機制

Cache for what? 簡單的說是為了節省流量 > 後端不能總是一直回復同樣的內容吧, 非常浪費資源 所以我們可以在Client端把訪問過的內容快取起來, 待下次要用時再直接從這兒拿出來 Expire 目前存在的方法是在HEADER加入Expires日期 Expires: Wed, 21 Oct 2017 07:28:00 GMT 告訴瀏覽器指定期間內, 相同的請求的話, 就去讀快取 Cache Control, max-age 除了指定明確日期之外, 我們也可以指定保存期限 Cache-Control: max-age=30 告訴瀏覽器, 快取的資料只有三十秒的保存期限 除此之外, 我們也可以在HEADER加入檔案的最後修改時間 Last-Modified Cache-Control: max-age=31536000 Last-Modified: 2017-01-01 13:00:00 目的是, 資料過期後, 瀏覽器可以用這個日期去詢問伺服器, 快取內的資料有沒有必要更新 If-Modified-Since: 2017-01-01 13:00:00 如果資料不變, 當然就繼續用嘍 除了用日期外, 另一個方法是使用ETag來判別檔案有沒有被修改 ETag 簡單的說, ETag有點像檔案內容的hash值 當檔案一改變ETag就會不一樣 所以瀏覽器可以根據後端給的ETag, 詢問伺服器使否要更新快取的內容還是繼續沿用原本的資料 Server Response Header ETag: "25749G2"  Browser Request Header if-None-Match: 25749G2

[AWS懶人包] 十分鐘搞懂S3

前言 AWS S3是Amazon最早提供的雲端服務之一, 發展至今也有10幾年的歷史了, 服務的範疇也越來越大, 不單純的只是像DropBox那樣, 讓人放檔案而已, 諸如版本控制, 加解密服務, 部屬靜態網站等等... 基本上在S3上, 檔案是以物件的形式存放的 每個物件都會有一組Key和Value, S3會根據Key Name 來決定物件要被存放的實體位置, 如果物件有相似的Key Name, 則會有根大的機率被放在同一個Partition mybucket/2018-08-26/photo1.png mybucket/2018-08-26/photo2.png S3容許我們存放 0 Bytes ~ 5TB 大的檔案, 但若是使用PUT請求上傳檔案的話, 最大只能接受5GB 物件的儲存類別 S3 這是最基本的儲存方式 S3-IA 這是用來存放較不常用的檔案類型, 相對的費用也會比較便宜, 但會根據request的次數來收錢 S3 One Zone IA 跟S3-IA一樣適合用來存放不常用的檔案類型, 差別是沒有備援的機制, 所以當遇上天災人禍時, 資料可能就飛了 Security 基本上剛建立的Bucket預設是都是private 但是我們可以透過 Bucket policy, ACLs 來決定存取存取權限 Bucket Policy : 屬於Bucket層級的存取機制 比如說: 我有個skilldata的bucket, 若想開放底下所有的物件, 讓外人可以存取, 可以將Bucket Policy定義如下 {      " Id " :   " Policy1538888263614 " ,      " Version " :   " 2012-10-17 " ,      " Statement " :   [           {                " Sid " :   " Stmt1538872791784 " ,                " Action " :   [

使用AWS S3 建置簡易登錄網站(Login Website)

前言: 基本上AWS S3除了單純放置檔案之外, 我們也可以在上面建立靜態網站, 老實說, 這是一項非常實用的功能, 尤其是專案在草創初期時, 可能會須要demo給客戶, PM, 或是老闆看, 在這時候若使用Static Website Hosting這項功能, 就可以很快速地完成部屬 但是, 在一般的情況下, 我們可能不會想讓所有的人, 都有能力去訪問這個網站, 所以這個時候,就會需要一個登陸頁面來驗證使用者的身分 以下實作如何在AWS S3 上建置登錄網站 Building a login website with AWS S3 基本上我們會有 登陸頁面 index.html 一個secret file負責導引 admin1234 網站首頁 home.html 設計的概念很簡單, 除了 index.html 以及 admin1234 之外, 所有檔案皆設為private, 存取home.html 時會檢查 header裡的 referer 來源是否為index.html, 也就是說任何人都無法直接訪問home.html, 除非是透過/index.html轉過來的請求 流程 登陸頁面會要求出入密碼 admin1234 當form送出去之後頁面會導引到 /admin1234 而/admin1234會再將頁面導到 /home.html 建立S3 Bucket 切到Properties下, 設定 Static Website Hosting 登陸頁面  Step 1.  上傳index.html到 S3 Bucket CODE SNIPPET END Secret File Step 1. 隨便建立以一個檔案admin1234 Step 2.  Metadata 設為 當index.html從使用這取得正確的密碼admin1234, 頁面會先被導引到這邊, 最後再被導引至/home.html 設定存取權限 在Permissions 底下, 我們可以透過Bucket Policy設定Bucket層級的存取權限 Step 1. 首先先將index.html以及admin1234設為公開 CODE SNIPPET END Home.htm

[C#] UWP 如何呼叫 WIN32 程式並取得執行結果

前言 當我們在開發UWP時, 有很多情況會需要呼叫WIN32程式做事, 比如說讀取註冊表裡的值,或是使用WMI取得系統或是BIOS資訊等等, 而這些事情光靠UPW是做不到的 以下教學示範如何呼叫WIN32做事並且取得執行結果 首先UWP的部分: 匯入套件Windows Desktop Extensions for the UWP 至UWP專案 Package.appxmanifest 宣告Application Extension 我們必須讓UWP知道我們要呼叫誰並且設為 fullTrustProcess 修改Package.appxmanifest 加入WIN32 Extension 到<application>裏頭 修改<Capabilities> App.xaml.cs 引用以下套件 喚起WIN32程式 修改 protected override void OnLaunched( LaunchActivatedEventArgs e) 加入底下程式碼 初始化App Service 發請求給WIN32程式 這邊我們先建立一個方法, 負責發送請求給win32程式 修改剛剛複寫的OnBackgroundActivated, 最後去呼叫SendRequestToWin32 WIN32部分 加入套件: 有兩個必要套件必須要加入倒WIN32專案中 1. Windows (待會會需要使用到Windows.ApplicationModel) 2. System.Runtime.WindowsRuntime (少這個套件的話 await connection.OpenAsync(); 會報錯) 加完套件後Reference如下 Program.cs 建立App service 連線 處理UWP的請求 完整程式碼 https://github.com/andy51002000/UWP-appservice-communicate-win32.git

[Azure APP Service] C# ASP.NET 讀取應用程式設定, Get value from APPSettings

前言 通常開發WEB服務時, 對於一些比較敏感的資訊, 我們會盡可能的不要寫死在程式碼裡(如資料庫帳密以及某API的ACCESS KEY)避免資訊外流的問題發生 又或是說, 當程式呼叫的某些REST API 有分正式與開發的版本的時候, 如果Endpoint是寫死在程式碼裡面, 絕對是非常非常的不方便, 開發的時候改成開發的, 上線前還要再改回來, 然後重新編譯 一般而言, 我們可以將這些資訊保存在外部檔案中,  Runtime的時候再來取得這些資訊 又或是將這些資訊寫在環境變數之中, 等Runtime的時候再來取得這些資訊 若你的WEB服務是部屬在 Azure App Service的話, 我們可以善用Application Settings這項功能, 我們可以將想要存的都寫在裡面 列如: 假設Application Settings 裡定義了BOT_NAME 以及 PROJECT_ID 我們可以使用以下程式碼來取值 System.Configuration.ConfigurationManager.AppSettings[] 首先, Step 1. Add Reference Step 2. Import Configuration           using System.Configuration; Step 3. Get Value 假設我們要取PROJECT_ID的值, 那程式可以這樣寫              var  ProjectId =  System .Configuration.ConfigurationManager.AppSettings[" PROJECT_ID "]                                        ??  "MY_DEFAULT_VALUE" ;

[UWP] 實作Oauth 2.0登陸取得AMAZON使用者帳戶資訊

前言: 有玩過臉書的人一定有過以下經驗, 當我們想在臉書上完算命或心理測驗的小遊戲時 就會被要求先登錄臉書的在後才能使用該服務, 這就是臉書的Oauth 2.0 認證機制 透過臉書提供的API讓程式導引使用者做認證, 進一步的授權給程式去取得使用者的資料 而Amazon也有提供類似的服務 首先 到Login With Amazon 註冊應用程式 Step 1. 打開Amazon Developer Console https://developer.amazon.com/home.html Step 2. 選擇 App Service/ Login With Amazon Step 3. 註冊應用程式 註冊完後會得到 Client Id 以及 Client Secret如下 Step 4. 設定Redirect Url 選擇Web Settings, 在Allowed Return Urls填入 https://localhost UWP 的部分 以Amazon提供的API取得access token API 規則 https://www.amazon.com/ap/oa?client_id=YOUR_CLIENT_ID &scope=profile &response_type=token &redirect_uri=https://localhost 程式範例: 取得Amazon使用者資料 API 規則 https://api.amazon.com/user/profile?access_token=YOUR_ACCEES_TOKEN 程式範例: DEMO: 點擊 Login 點擊Show user data 若需要完整的程式碼也可以到以下的網址下載 完整程式碼