2019年12月24日 星期二

[C#]伺服器認可通訊協定違規. Section=ResponseHeader Detail=CR 必須在 LF 之前

透過 .NET  WebRequest 寫爬蟲抓取老舊系統時,發生錯誤

伺服器認可通訊協定違規. Section=ResponseHeader Detail=CR 必須在 LF 之前


解決方式(參考MSDN):
  Web.config 中<httpWebRequest> 設定 useUnsafeHeaderParsing="true"

不過MSDN中有提到這個設定方式是有風險的:

根據預設,.NET Framework 會嚴格地強制執行 RFC 2616 以進行 URI 剖析。 某些伺服器回應可能會在禁止的欄位中包含控制字元,而這會導致 HttpWebRequest.GetResponse() 方法擲回 WebException 如果useUnsafeHeaderParsing設定為true,在此情況下,HttpWebRequest.GetResponse() 將不會擲回。不過,您的應用程式很容易受到數種形式的 URI 剖析攻擊 最佳的解決方法是變更伺服器,讓回應不包含控制字元。

2019年10月28日 星期一

chrome command 指令小抄


--disable-infobars 可用於隱藏 windows xp 開啟chrome時上面都會出現 停止支援的黃色訊息

--start-fullscreen  開啟chrome後直接進入全螢幕模式( F11),目前在chrome 49 有效,我目前最新版chrome 77 執行無效

2019年10月16日 星期三

[網站開發筆記]axios.post 參數如何從ASP.NET 的Request物件取出

         axios get 傳參數時 用 params 包起來後會以Query String方式傳遞在ASP.NET 可以用 Request["..."] 或 Request.QueryString["..."]取得:

例如:
                    axios.get("xxxxx.aspx", params:{ id : 'abc' })
                    .then((res) => { })
   
         
                   String id = Request["id"];

       
                    axios.post("xxxxx.aspx", { id : 'abc' })
                    .then((res) => { })

         axios post 傳參數時 在ASP.NET 用 Request["..."] 或 Request.QueryString["..."]會取不到資料,因為post是將參數放在 Request Payload中,所以要透過Request.InputStream將資料取出,
可再透過 JsonConvert.DeserializeObject轉成json物件來做後續處理

     
        StreamReader stream = new StreamReader(Request.InputStream);
        String requestPayload = stream.ReadToEnd();
        var postData = JsonConvert.DeserializeObject<dynamic>(requestPayload);

     
          String id = postData["id"];
     

2019年10月3日 星期四

[Notepad++]實用正規表示式語法移除空白列


^\s  : 搜尋空白列: 在取代空白列時很好用

整理資料時有一些空白行要移除,可參考以下方式

範例資料:


Ctrl + H 進行開啟取代視窗:
    a.尋找內容:  ^\s
    b.搜尋模式點選 “規則運算式”
    c.執行全部取代
 


取代結果如下:
  (注意,以此語法最後一行空白列不會取代到)



彩蛋~~~
其實Notepadd++已有內建這個功能了,
不用這麼累 XD:





2019年10月1日 星期二

Google雲端硬碟檔案無法下載 HTTP ERROR 403 問題

接獲報案:客戶提供Google Drive的共用檔案連結,裡面的檔案無法下載

該連結是可以查看到檔案的(如下),但點選Download後會出現如下訊息

存取 doc-00-ak-docs.googleusercontent.com 的要求遭到拒絕


經查原因是用戶在該瀏覽器或狀置中有以多個不同google帳號登入
Google因潛在安全性的問題而有這個授權不足限制。

Google Drive Help 有相關的issue討論

解決方式是將帳號都登出,再以一個帳號登入即可


[SQL Server] SQL語法 Where 條件查詢簡體中文問題

很基本的常識:

資料庫的欄位為 nvarchar
以下SQL語法查詢時簡體中文會查不到資料

select *
   from xxxx
 where col like '%%'

Sql語法中如要查詢 utf-8的欄位須加上 N

select *
   from xxxx
 where col like N'%%'

[ASP.NET] ADO.NET Parameters.AddWithValue 效能問題

最近發現在一個簡單的查詢語法發現效能不佳,
經查發現問題出在SqlCommand參數化查詢使用 AddWithValue,
改善後 原查詢耗時 950 ms 調整後為 24 ms!


參考: 史丹利好熱 的相關文章:

[.NET] ADO.NET Parameters.AddWithValue 對於SqlDbType的抉擇


史丹利好熱文中提到:

AddWithValue 參數化查詢時,在DbType的選擇是採.NET資料類型來決定,若查詢參數型別與實際欄位不同時有時可能會造成額外的成本

解決方式:

不要使用AddWithValue,改用 SqlParameter,並指定 SqlDbType
範例:
            SqlCommand cmd = new SqlCommand(qs, sqlConnection);
            SqlParameter p_gen01 = new SqlParameter();
            p_gen01.SqlDbType = SqlDbType.VarChar;
            p_gen01.ParameterName = "@empno";
            p_gen01.Value ="ep0020";


若使用Dapper 指定型態方式,參考範例:
            var result = sqlConnection.Query(qs,
                                            new { empno = new DbString() {
                                                Value = "ep0020",
                                                IsAnsi = true, } });




2019年9月3日 星期二

[LINQ運用實例]SelectMany使用情境



(1)扁平化的功能:
     ex. 將二維陣列 轉成 一維


String[][] names = {
new []{"tony"},
new []{"peggy","alex"},
new []{"richie","annie"}
};

var result = names.SelectMany( name => name);

//這邊的 result 將會是  { "tony", "peggy", "alex", "richie","annie"}
foreach(var r in result){
    Console.WriteLine(r);
                }

2019年8月12日 星期一

[Excel問題]Excel檔案無法開啟-xls 中找到無法讀取的內容

excel 2007,在收到舊版 excel 2003 的xls檔時,
有時開啟檔案會出現無法讀取訊息如下:

Excel 在 ... xls 中找到無法讀取的內容。您要回復此活頁簿的內容嗎?若您信任此活頁簿的來源,請按一下是




按"是"之後裡面的格式都不見了

我的解決方式是:

使用  LibraOffice 開啟該文件後,再存檔。

再用 excel 2007打開時就順利打開了。

如果有遇到相同情況,可以試試這招。

2019年8月8日 星期四

[Excel小技巧]Excel複製要移動或複製的公式或工作表中含有名稱xxx問題

Excel複製要移動或複製的公式或工作表中含有名稱xxx問題如下:




Google到解決方法如下:





資料表有一些無效的定義名稱(如:ccccc,ggggg,gggggggggg)
到公式→名稱管理員中將之清除即可


仍然出現時訊息,原因為有些名稱是被隱藏起來的


利用vba將它顯示出來後就可完整看到名稱,如圖所示:


於該工作表內執行下列巨集程式即可:

Sub NameShow()
    Dim nm As Name
    Dim bVisible As Boolean

    With ThisWorkbook
        If .Names(1).Visible = False Then bVisible = True

        For Each nm In .Names
               nm.Visible = bVisible
        Next nm

    End With

    Exit Sub
End Sub



2019年7月9日 星期二

[ASP.NET]簡易設計擴充方法範例




using System;
using System.Collections.Generic;
using System.Linq;

namespace RichieCS
{
    public static class RichieCSExtension{
        public static string SayHello(this string original){
            return "Hello~" + original ;
        }
        public static string CalBornYear(this int original){
            return string.Format( "You are born in {0}", DateTime.Now.Year - original );
        }
    }
   
    public class Program
    {
        public static void Main(string[] args)
        {
           
            var myname = "Richie";
            var myage = 18;
            Console.WriteLine(myname.SayHello());
            Console.WriteLine(myage.CalBornYear());
        }
    }
}

2019年7月3日 星期三

[ASP.NET開發筆記]C# System.Net.Mail 郵件附件中文檔名發送失敗問題


C# System.Net.Mail 郵件附件中文檔名發送失敗問題


最近開發時在發送mail的附件上卡關,
明明在開發機上是正常的,到了正式主機時就失敗…
雖然第一個反應是版本不一致的原因,
最好的方式是開發與正式機的版本相同就不會有困擾了,
但總有個不得已…所以通常我是試看看哪個的方式
可以在二個環境都順利執行,
好處是可以挖出一些原本自已不知道的問題
壞處是要花時間找問題,趕時間時會死人…

先簡單描述一下問題:


開發機的 .NET Framework CLR 版本:4.0.30319.42000

正式主機的.NET Framework CLR 版本:4.0.30319.1022

當附件名稱設定時使用 Attachment.ContentDisposition.FileName 有中文名稱,在正式主機會失敗

改為 Attachment.Name 設定中文名稱,在開發、正式機都可以順利執行

以下是簡短的code 測試

byte[] bytes = Encoding.UTF8.GetBytes("abc");
MemoryStream memStream = new MemoryStream(bytes);

Attachment attachedFile = new Attachment(memStream, MediaTypeNames.Application.Octet);

attachedFile.ContentDisposition.FileName = "測試";  //中文字會失敗

//解法:
//(1)對附件以Base64編碼方式處理( TransferEncoding.Base64 )
//(2)改用:attachedFile.Name = "測試";



 微軟對判斷安裝的.NET Framework版本說明中提到:

CLR 版本是以 .NET Framework 應用程式執行所在的執行階段為基礎。
單一的 CLR 版本通常會支援多個 .NET Framework 版本。
例如,CLR 4.0.30319.xxxxx 版支援 .NET Framework 4 到 4.5.2 版,其中 xxxxx 會小於 42000,
而 CLR 4.0.30319.42000 版支援從 .NET Framework 4.6 起的 .NET Framework 版本。

所以 .NET Framework 4.6以上附件中文名稱使用ContentDisposition.FileName 是正常的,4 ~4.5.2 的話,如果想要用ContentDisposition.FileName可以順利過關的話,有個方法是用Base64來將檔名編碼,怎麼用Base64編碼可以參考這裡

花了點時間測了一下,不想這麼麻煩,可以試試 不要設定Attachment的ContentDisposition.FileName, 只設定 Attachment.Name 就好,這個方法可過,原理?我還沒開智慧,就偷賴結論為:版本問題吧~


2019年1月11日 星期五

[Android開發筆記]如何透過adb 進行reboot重開手機?


在adb.exe所在路徑下先查詢裝置的ID:adb devices

如下例 ID為 97cda60a
然後就可以下指令進行重開: adb -s 97cda60a reboot


2019年1月10日 星期四

[PDF小技巧]簡易不求人免安裝手動切割PDF檔案



有時會遇到PDF檔案太大,當要寄送mail、或是超過系統上傳限制檔案大小限制,
這時就會很希望有分割PDF的工具,如果量不大的話其實可以使用Chrome 瀏灠器 的列印功能就可以達到需求,不須要另外安裝什麼工具,是不是很方便呀~

操作方式:

1.以Google Chrome開啟要分割的 pdf 檔案
   在檔案滑鼠右鍵 --> 開啟檔案 --> Google Chrome
    (也可以直接將檔案直接拖曳到 Chrome 瀏灠器來開啟)
  


 2.點選印表機的圖示


 3.在列印對話視窗中
   目的地: 另存為 PDF
   頁數:     選項點選第二個,再輸入本次要列印的頁數,
   例如 總頁數為4頁,要分成二個pdf檔的話可以
          第一次列印時填 1 - 2
          第二次列印時填 3 - 4


   這樣是不是很簡單的達到分割的功能了呀?



不過如果你要分割的pdf 數量很大…那還是乖乖的去找其他軟體來分割吧
不然會按到天荒地老..........



 

2019年1月3日 星期四

[Excel小技巧] 如何超連結到外部excel檔案的特定欄位



Excel 超連結可以開啟另外一個excel的檔案,也可以使用錨點來定位到另一個檔案的特定欄位
以下範例展示如何完成這個功能:


在要製作超連結的地方滑鼠按右鍵 --> 超連結


選取 "現存的檔案或網頁" --> 點選要超連結的目標excel檔案 --> 在網址那個欄位的最後面加入要定位到哪個欄位,例如 我要連結到 "超連結目標檔案.xlsx" 的 G109 欄位,則網址的值為:

超連結目標檔案.xlsx#G109





最後點選測試是否如預期超連結到目標欄位




[Word小技巧]-儲存格設定網底顏色問題

有時在Office Word中編輯儲存格進行設定網底顏色時會出現文字的地方沒有如預期改變顏色

如下圖,欲將第一列的三個儲存格改變網底顏色,但其中文字卻仍為白色



解決的方式為移除這些文字的格式設定,以Office Word 2007 為例,先選取要移除的文字,再點選下圖紅色框 "清除格式設定" 的按鈕


再進行網底顏色的設定便可以如預期的改變整個儲存格的網底顏色了~