跳到主要內容

發表文章

目前顯示的是有「c#」標籤的文章

C# Linq Select() 在 Java 的對應!!

最近用 Java 8 在寫 Android 的 Side Project, 由於因為工作的關係比較熟悉 C#,寫一寫覺得很多地方很不習慣,除了 Json 要使用 Gson library 來做序列化以外,還有 C# 的 LINQ 在 Java 用發也差很多。 這裡特別紀錄一下 C# 中 LINQ 的 Select() var result = productList.Select(x = > x.name).ToList(); Console.WriteLine(result); 在 Java 中 有 Stream() 可以用。例如  String result = productList.stream() .map(p -> p.name) .collect(Collectors.toList()); System.out.println(result); 來完成,之後如果使用到更多的功能,再來補充吧~

C# CSRF attribute 的錯誤追蹤與處理

最近開發網站碰到一個問題,有時候可以登入成功,有時候不行。但明明帳密都是 Google 記憶的,不可能打錯帳號密碼。後來猜想到是 CSRF 認證的問題,由於網站是透過 k8s 建立的,且 replicas: 2。很大可能性是因為拿 token 是跟 A Pod 拿,但登入是跟 B pod 登入,造成 token 無法驗證成功。 想證明這個問題,我們必須去紀錄 Log,由於我們是透過 C# 的 ValidateAntiForgeryToken Attribute 實作 CSRF 的防禦,因此一開始想法是寫一個 ExceptionFilter 去攔截例外。但發現無法攔截 CSRF 的問題。後來找了一段時間發現,CSRF 並不是丟出例外,而是結果回覆 HttpStatusCode 400。查到可實作 IAlwaysRunResultFilter 攔截結果,並判斷是否是 IAntiforgeryValidationFailedResult 的一種。 程式碼如下:  public void OnResultExecuting(ResultExecutingContext context) { if (context.Result is IAntiforgeryValidationFailedResult result) { // Log here } } 但是這樣還不夠。還必須要強制關閉客戶端錯誤的轉換才行,這樣才可以精準的把結果視為 IAntiforgeryValidationFailedResult 至於怎麼關閉則是在註冊 MVC 服務的時候設定 Config SuppressMapClientErrors = true 即可。      services.AddMvc().ConfigureApiBehaviorOptions(options => { options.SuppressMapClientErrors = true; }); 詳細可以參考 MSDN

ReSharper C# Shortcut series [ReSharper_EnableDaemon]

  今天在查詢怎麼讓 Resharper 效能提升一點,查到了一個熱鍵很適合在超大型專案上使用,馬上筆記下來。因為在修改公司的老專案時的某些檔案時真的會讓 Resharper 很卡很卡,這時候可以暫時針對這個檔案停止分析,停止分析也不會影響使用 ReSharper 的熱鍵的。這個熱鍵名稱是 [ReSharper_EnableDaemon],預設的 shortcut 是 Ctrl + Shift + Alt + 8。 有需要的朋友可以參考一下。

C# 小坑 [MemoryStream] 無法正確輸出檔案下載

今天在寫一個將資料下載成 Excel 的檔案的 API 時,遇到怎麼下載檔案大小都是 0,且無法開啟的問題。後來發現是因為使用了 MemoryStream 來寫資料,寫完之後它的位置在最後面。因此後來傳給 HttpMessageResponse 的 HttpContent 時,從最後面讀取,因此檔案大小都是 0. 所以加上了一段,把 position 設定回 0 的邏輯才解決這個問題。           public Stream GetReportStream(Report report) { var memoryStream = new MemoryStream(); using (var workbook = new XLWorkbook()) { workbook.AddWorksheet(report.Details, "Details"); workbook.AddWorksheet(report.Summary, "Summary"); workbook.SaveAs(memoryStream); memoryStream.Position = 0; } return memoryStream; }           private static HttpResponseMessage HttpExcelFile(Stream excel, string fileName) { var result = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StreamContent(excel) }; result.Con...

物件導向複習筆記

參考網址:  https://dotblogs.com.tw/ace_dream/2016/01/10/oop1 物件導向的三大特性: 封裝:(Encapsulation):指的是將一組相關的屬性、方法和其他成員,視為單一單位或物件。 繼承(Inheritance):則是描述依據現有類別來建立新類別的能力。 多型(Polymorphism):指的是您可以有多個交替使用的類別,即使每個類別是以不同的方式來實作相同的屬性或方法。 封裝:(Encapsulation): 物件都會擁有物件內部的私有部分(屬性、方法...)而這些部分必須是外界無法直接存取,這樣才能保有物件的完整性。 如果"破壞封裝"的話,會有可能無法恢復原來的功能,因此物件必須將私有的部分封裝在物件的內部,而使用者只能藉由物件所提供的方法、屬性來操控物件,以保持物件的完整性,這就是封裝的特性。 繼承(Inheritance): 一個物件A得到另一個物件B特性的過程稱為“A繼承B”,物件B則屬於“父類別”或稱基礎類別(Base class),物件A則屬於子類別或稱為衍生類別(Derived class)。 子類別可以繼承父類別的能力,直接使用父類別非私有的屬性和方法。 子類別只能繼承一個父類別。 父類別的方法若宣告為虛擬(virtual),則表示該方法可以被子類別覆寫(非必需)。 父類別的方法若宣告為抽象(abstract),則表示該子類別一定要覆寫該方法(子類別為抽象類別除外)。 類別若包含抽象成員,則該類別必需宣告為抽象類別。 父類別又叫做基底類別(Base Class)。 子類別又叫做衍生類別(Derived Class)。 若方法或屬性宣告為密封(sealed),則不可以被子類別覆寫 多型(Polymorphism):又稱同名異式,是透過動態繫結的方式讓我們在程式執行時期可以動態決定物件參考所要執行的方法,多型允許我們在程式中使用名稱相同的方法或屬性,但不須考慮當時使用的物件型別是什麼。若要設計多型,子類別就必須先覆寫父類別同名稱的方法或屬性,接著再使用父類別的物件參考來選擇所要執行子類別物件實體的方法。由於多型的使用上會在類別中建立名稱相同的成員(屬性或方法),多載(Overloading)和覆寫(Overriding)也可以建立...

Multiple without multication or addition operator

Given two binary strings, return their sum (also a binary string). For example, a = "1101" // 13 b = "1000" // 8 Return “1101000”. // 104 Solution: implement Binary add to perform multication static int MultipleWithoutOperator(int num, int multiplier) { StringBuilder sb = new StringBuilder(); string binary = Convert.ToString(num, 2); string binaryMultiplier = Convert.ToString(multiplier, 2); string temp = ""; for (int i = binaryMultiplier.Length-1, j=0;i >= 0;i--,j++){ if (binaryMultiplier[i]=='1') { if (string.IsNullOrEmpty(temp)) { temp = binary.PadRight(binary.Length + j, '0'); } else { temp = BinaryAdd(temp, binary.PadRight(binary.Length + j, '0')); } } } return Convert.ToInt32(temp, 2); } static string BinaryAdd(string a, string b) { int carryover = 0; Stri...

Counting program running time

Sometims we want to know how fast our program running, I found two methods on stack overflow. DateTime dt = DateTime.Now; for (.......) { } TimeSpan ts = DateTime.Now - dt; Console.WriteLine("total runtime: " + ts.ElapsedMilliseconds.ToString() + "ms"); or (according to MSDN) if you need better resolution Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); for (.......) { } stopWatch.Stop(); Console.WriteLine("total runtime: " + stopWatch.ElapsedMilliseconds.ToString() + "ms");