Posts
C# 6.0 - Await in catch/finally
C# 6.0 以前 await 無法用在 catch/finally 區塊,C# 6.0 後開始支援。
using System; using System.Threading.Tasks; namespace ConsoleApplication10 { class Program { static void Main(string[] args) { Test(); System.Threading.Thread.Sleep(10000); } private static async void Test() { try { throw new Exception(); } catch { Console.WriteLine("Catch..."); await Task.Delay(500); } finally { Console.WriteLine("Finally..."); await Task.Delay(500); } } } }
read morePosts
Web Deploy - Automatic Backups
若想讓 Web Deploy 在 Deploy 時自動幫我們進行網站的備份,甚至是控管備份的數量,我們可以將 Web Deploy 的 Automatic Backups 功能啟用。
要啟用時我們需將 Server IIS 的 Configuration Editor 開啟,可以針對整台機器進行設定,或是針對 Site 進行設定,這邊視個人需求而定。
{% img /images/posts/WebDeployAutoBackup/1.png %}
Configuration Editor 開啟後,上方的 Section 記得切到 system.webServer/wdeploy/backup。接著將 enabled 與 turnedOn 設為 True,按下右側的 Apply 進行套用,即完成 Automatic Backups 功能開啟的動作。
{% img /images/posts/WebDeployAutoBackup/2.png %}
若有需要這邊我們也可以更改 backupPath 去設定備份的位置,或是更改 numberOfBackups 去設定備份保留的數量。
功能開啟後,只要透過 Web Deploy 進行佈署,Web Deploy 即會幫我們自動將 Application 備份。我們可以從 Web Deploy 的 Deploy 訊息看到該功能是否有成功的生效。
{% img /images/posts/WebDeployAutoBackup/3.png %}
若是在備份時失敗,Web Deploy 的 Deploy 訊息也會告知。
read morePosts
Assembly Binding Redirect
在開發上有時我們會需要將組件版本導向,可能是因為不同專案用到不同版本的相依組件,或是基於某些原因要將某個組件用特定版本替換。這時我們可以透過 Assembly Binding Redirect 來做到這件事。
Assembly Binding Redirect 可在電腦或是應用程式層級進行組件的導向,這邊以應用程式層級的導向做個簡單的介紹。
首先,Config 檔內必須在 configuration
untime 節點下加入 assemblyBinding 節點,其 xmlns 屬性需指定字串 “urn:schemas-microsoft-com:asm.v1”。
<?xml version="1.0" encoding="UTF-8"?> <configuration> ... <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">...</assemblyBinding> </runtime> ... </configuration> 若要限定特定 .NET Framework 版本的組件才做導向,可加上 appliesTo 屬性,並指定 .NET Framework 的版本。像是要指定只對 .NET 3.5 的組件導向的話可下面這樣編寫:
<?xml version="1.0" encoding="UTF-8"?> <configuration> ... <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1" appliesTo="v3.5">...</assemblyBinding> </runtime> ... </configuration> 接著在 assemblyBinding 下我們需加上 assemblyIdentity 節點,用以指定所要導向的組件。像是要導向 Json.NET 組件的話就會像下面這樣:
<?xml version="1.0" encoding="UTF-8"?> <configuration> ... <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.
read morePosts
ApacheBench - A simple stress testing tool for http server
ApacheBench 簡稱 ab,是 Apache 自帶的 HTTP 負載測試命令列工具,程式主檔在 Apache 安裝目錄下的 bin 目錄內,可安裝 Apache 後取出使用,或是下載 Standalone 版本 使用也可。
{% img /images/posts/ApacheBench/1.png %}
使用方式及參數如下:
Usage: /usr/sbin/ab [options] [http[s]://]hostname[:port]/path Options are: -n requests Number of requests to perform -c concurrency Number of multiple requests to make -t timelimit Seconds to max. wait for responses -p postfile File containg data to POST -T content-type Content-type header for POSTing -v verbosity How much troubleshooting info to print -w Print out results in HTML tables -i Use HEAD instead of GET -x attributes String to insert as table attributes -y attributes String to insert as tr attributes -z attributes String to insert as td or th attributes -C attribute Add cookie, eg.
read morePosts
Json.Net - Custom Converter
Json.Net 用到後面,我們免不了有時會要 Custom Converter 去做序列化的客製動作。
使用 Json.Net 要做自定義序列化,我們可以 Custom Json.Net 的 Converter,為此需要建立一個 Converter 類別,將之繼承自 JsonConverter,接著將繼承而來的方法實作即可。
CanConverter 用來決定該型別是否可被該 Converter 處理、WriteJson 用來序列化物件、ReadJson 用來解序列化物件。
像是我們可以像下面這樣做個簡易的 Converter,裡面只是單純的將物件序列化與解序列化。
using System; using Newtonsoft.Json; namespace LevelUp.Converter { public class ConcreteTypeConverter<TConcrete> : JsonConverter { public override bool CanConvert( Type objectType) { return true ; } public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { return serializer.Deserialize<TConcrete>(reader); } public override void WriteJson( JsonWriter writer, object value, JsonSerializer serializer) { serializer.
read morePosts
Trello - Calendar power-up
要啟動 Trello Calendar 功能,我們可以開啟 Trello 的右側 Menu,點選 Power-Ups 選項。
{% img /images/posts/TrelloCalendar/1.png %}
Power-Ups 這邊有三個進階的功能可供開啟,這邊我們只要開啟 Calendar 功能,因此點選 Calendar 就好。
{% img /images/posts/TrelloCalendar/2.png %}
這邊 Trello 會跟你介紹一下 Calendar 功能,直接按下 Enable 按鈕啟用即可。
{% img /images/posts/TrelloCalendar/3.png %}
注意到這邊,啟用下方的設定頁面可供我們決定是否啟用 iCalendar Feed,若想將 Trello 的卡標示在我們慣用的日曆像是 Google Calendar,這邊可以將之啟用,並將下方的 Feed 位置加入慣用的日曆。
{% img /images/posts/TrelloCalendar/4.png %}
Trello Calendar 啟用後,Trello 的右上方會多一個 Calendar 連結,點選可進入 Trello Calendar。
它有提供週日曆…
{% img /images/posts/TrelloCalendar/5.png %}
及月日曆兩種呈現方式,我們可依需求下去切換。
{% img /images/posts/TrelloCalendar/6.png %}
有壓上 Due Date 的 Trello 卡都會在日曆上呈現,有需要也可以在 Trello Calendar 指定的日期上直接加上 Trello 卡,或是將 Trello 卡拖曳進行 Due Date 的調整。
read morePosts
Web API - Adding Request.IsLocal to ASP.NET Web API
要判斷 Request 是否為本地 Request,在 ASP.NET 那邊因為 Request 是 HttpRequest 型態,內建有 IsLocal 方法,可以直接叫用判斷。
但在 Web API 就沒辦法那麼直接判斷,因為 APIController.Request 是 HttpRequestMessage 型態,沒有 IsLocal 方法可以直接叫用。要自行處理這樣的判斷可以查閱 Request 內的 MS_IsLocal Property 值,這邊國外的網友已經有現成寫好的擴充方法:
public static class HttpRequestMessageExtensions { public static bool IsLocal(this HttpRequestMessage request) { var localFlag = request.Properties["MS_IsLocal"] as Lazy<bool>; return localFlag != null && localFlag.Value; } } 放進專案中直接使用即可:
public HttpResponseMessage Get() { if (Request.IsLocal()) { //do stuff } } Link Adding Request.IsLocal to ASP.NET Web API StrathWeb How to filter local requests in asp.
read morePosts
PsExec - Execute process remotely
PsExec 是一命令列工具,可讓我們執行遠端電腦的程式。
使用前請先至 PsExec 下載。
{% img /images/posts/PsExec/1.png %}
使用方式如下。
psexec [\computer[,computer2[,...] | @file]][-u user [-p psswd][-n s][-r servicename][-h][-l][-s|-e][-x][-i [session]][-c [-f|-v]][-w directory][-d][-<priority>][-a n,n,...] cmd [arguments] 常用的參數有 -c、-i、-l、-w、-s、-u、-p,更多細節可直接輸入 psexec 命令查閱。
{% img /images/posts/PsExec/2.png %}
簡單的說,呼叫時要指定欲操作的遠端電腦,依需求帶入命令與參數就可以了。
像是要單純的讓遠端電腦執行命令,我們就可以直接在後面 psexec 後面加上指定的電腦與欲執行的命令。像是若要查閱遠端電腦的檔案內容我們就可以像下面這樣叫用:
psexec \TWDT092 cmd /c dir d: {% img /images/posts/PsExec/3.png %}
命令第一次使用會跳授權視窗,如果要跳過授權視窗,可帶上 /accepteula。
psexec \TWDT092 /accepteula cmd /c dir d: 要查閱遠端電腦的 IP 設定的話:
psexec \TWDT092 -s ipconfig /all {% img /images/posts/PsExec/4.png %}
要執行遠端電腦指定位置的檔案的話:
psexec \TWDT092 c:in est.
read morePosts
Get the Public Key of an Assembly
在做 .NET 程式的開發時,有時候我們會需要查閱組件目前簽署的 Public Key 為何 (可能是為了確定組件是否跟我們預期的是同一個,或是要做些 Config 設定,抑或是反射叫用)。這時我們可以直接透過 Visual Studio 安裝時自帶的強命名命令列工具下去查閱,呼叫 SN 命令,帶入 -TP 參數與組件的檔案位置。
sn.exe -Tp [AssemblyFile] 命令呼叫後會看到類似下面這樣的畫面,告訴你簽署 Public Key 以及 Public Key Token 為何。
{% img /images/posts/PublicKeyWithAssembly/1.png %}
也可進一步將之與 Visual Studio 整合,加入 External Tools,Command 那邊指向 SN.Exe 的位置,Arguments 那邊設定 -Tp $(TargetPath) 就可以了。
{% img /images/posts/PublicKeyWithAssembly/2.png %}
設定完以後就可以直接透過 Visual Studio 的 External Tools 直接觸發查詢當前專案產出的組件。
{% img /images/posts/PublicKeyWithAssembly/3.png %}
Link Sn.exe (Strong Name Tool) asp.net - How do I find the PublicKeyToken for a particular dll?
read morePosts
Code Cracker
Code Cracker 是 Roslyn analyzer 的 Library,有點類似 FxCop 的 Rule,依不同的範疇實做了很多相關的檢查,可以看到有 Design、Globalization、Maintainability、Naming、Performance、Portabili、Security …等。雖然還未完全實作完畢,但目前已經相當多的檢查 Rule 了。
{% img /images/posts/CodeCracker/1.png %}
安裝上一樣是提供 VSIX 或是 NuGet Package 兩種,若是要套到所有專案,可直接透過 Extension and Updates 安裝。
{% img /images/posts/CodeCracker/2.png %}
若是只要套用到單一專案,可直接透過 NuGet 安裝。不論是要用 NuGet 的 GUI 介面。
{% img /images/posts/CodeCracker/3.png %}
或是直接透過 NuGet 命令都可以。
Install-Package CodeCracker.CSharp -IncludePrerelease Install-Package CodeCracker.VisualBasic -IncludePrerelease 用 NuGet 安裝的話,Analyzer 會出現在方案總管的 References\Analyzers 節點下。
{% img /images/posts/CodeCracker/4.png %}
展開 Analyzer 節點可進一步看到支援的 Rule。
{% img /images/posts/CodeCracker/5.png %}
read more