2014年12月29日 星期一
動態調整Gridview欄位寬度和置中
CodeBehind方式設定GridView欄寬、置中
http://tgw1029.blogspot.tw/2010/02/codebehindgridview.html
GridVIew 設定欄寬問題
http://www.blueshop.com.tw/board/FUM20041006161839LRJ/BRD20120904002723URR.html
2014年12月26日 星期五
2014年12月25日 星期四
簡單的搜尋引擎 + CheckBoxList (實用)
http://blog.sina.com.tw/myvufzbi/article.php?pbgid=91238&entryid=595441
把資料展現到畫面上
ExecuteReader
//建立連線
SqlConnection conn;
conn = new SqlConnection("data source = EasyFlow;initial catalog = EFNET;user id =sa;password = XXX");
conn.Open();
SqlConnection conn;
conn = new SqlConnection("data source = EasyFlow;initial catalog = EFNET;user id =sa;password = XXX");
conn.Open();
//下指令
SqlCommand cmd;
cmd = new SqlCommand("select dept as 部門,empname as 員工名稱,empno as 員工代號,extension as 分機,phs as PHS from extension where deptno like @empno", conn);
cmd.Parameters.Add("@empno", SqlDbType.NVarChar).Value = txt_what.Text.Trim() + "%";
SqlCommand cmd;
cmd = new SqlCommand("select dept as 部門,empname as 員工名稱,empno as 員工代號,extension as 分機,phs as PHS from extension where deptno like @empno", conn);
cmd.Parameters.Add("@empno", SqlDbType.NVarChar).Value = txt_what.Text.Trim() + "%";
//讀取到中介
SqlDataReader dr;
dr = cmd.ExecuteReader();
SqlDataReader dr;
dr = cmd.ExecuteReader();
//仲介資料給GridView去顯示
GridView.DataSource = dr;
GridView.DataBind();
GridView.DataSource = dr;
GridView.DataBind();
//若要讀取仲介的每一筆資料並丟給DropDownList
while (dr.Read())
{
DropDownList.Items.Add(dr["dept"].ToString()); //dr["dept"].ToString() 是dr的dept欄位資料
}
while (dr.Read())
{
DropDownList.Items.Add(dr["dept"].ToString()); //dr["dept"].ToString() 是dr的dept欄位資料
}
2014年12月19日 星期五
[PHP]登入頁面製作
PHP會員登入機制,session的使用,簡易型電話簿範例(對MySQL新增、修改、刪除)!
使用 SESSION 來記錄 Web 應用程式的狀態
PHP Session 使用介紹,啟用與清除 session
google "php login session" 應該很多資訊
PDO登入
PHP 利用 phpmailer 透過 gmail 寄信
PHP 利用 phpmailer 透過 gmail 寄信
http://belleaya.pixnet.net/blog/post/27410978-%5B%E6%95%99%E5%AD%B8%5D-php-%E5%88%A9%E7%94%A8-phpmailer-%E9%80%8F%E9%81%8E-gmail-%E5%AF%84%E4%BF%A1http://sourceforge.net/p/phpmailer/code/HEAD/tree/phpmailer/branches/5.0-dev/
[PHP] 解決(非 ASCII 編碼)中文郵件寄件者或中文郵件收件者名稱, 或中文信件標題亂碼問題
http://jjdai.zhupiter.com/2010/10/php-%E8%A7%A3%E6%B1%BA%E4%B8%AD%E6%96%87%E9%83%B5%E4%BB%B6%E5%AF%84%E4%BB%B6%E8%80%85-%E6%94%B6%E4%BB%B6%E8%80%85-%E4%BF%A1%E4%BB%B6%E6%A8%99%E9%A1%8C%E4%BA%82%E7%A2%BC%E5%95%8F%E9%A1%8C/
PHPMailer SMTP設定
http://shinychang.net/article/537ed4a5893c161c08715778
PHP Mailer SMTP送信範例 For V5.1
學校信件認證使用:
$mail->SMTPSecure = "tls";
2014年12月10日 星期三
PDO取資料方式
PDO - 取得資料的方式
http://ron314159.blogspot.tw/2013/08/pdo-get-data-methods.htmlhttps://nicole929chan.wordpress.com/category/php/pdo/
PHP中的PDO函數庫(PDO Functions)
http://labview360.com/forum/forum_posts.asp?TC=KSW30LTC6X0Y&KW=Tab&fp=yes&ts=41900.8462615741
How to Create Login Page in PHP/MySQL using PDO Query
http://www.sourcecodester.com/tutorials/php/6102/how-create-login-page-phpmysql-using-pdo-query.html
PHP5.x + sqlsrv
PDO(PHP Data Objects)學習
http://blog.yam.com/csylvia/article/72659816
[PHP] 製作登入頁面
http://james670818.pixnet.net/blog/post/2337519-%5Bphp%5D-%E8%A3%BD%E4%BD%9C%E7%99%BB%E5%85%A5%E9%A0%81%E9%9D%A2
2014年12月3日 星期三
php連mssql亂碼設定
關於MS SQL亂碼問題
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20071105181417AEX&fumcde=FUM20041006152627A9N
https://social.msdn.microsoft.com/Forums/zh-TW/c6ee4121-8d2a-4ed0-b819-a99bc2c85496/php-mssql-?forum=240
標準步驟設定
http://patw.idv.tw/blog/archives/49
PHP連MSSQL
http://www.dotblogs.com.tw/joe80075/archive/2011/02/09/21288.aspx
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20071105181417AEX&fumcde=FUM20041006152627A9N
https://social.msdn.microsoft.com/Forums/zh-TW/c6ee4121-8d2a-4ed0-b819-a99bc2c85496/php-mssql-?forum=240
標準步驟設定
http://patw.idv.tw/blog/archives/49
PHP連MSSQL
http://www.dotblogs.com.tw/joe80075/archive/2011/02/09/21288.aspx
2014年12月2日 星期二
使用XMLHttpRequest
使用XMLHttpRequest
XMLHttpRequest執行AJAX 跨網域存取
AJAX 上手篇
http://wiki.moztw.org/AJAX_%E4%B8%8A%E6%89%8B%E7%AF%87
http://italwaysrainonme.blogspot.tw/2012/10/phpjavascriptajaxgetpost.html
[php][javascript]AJAX簡易範例(GET、POST傳送)
http://italwaysrainonme.blogspot.tw/2012/10/phpjavascriptajaxgetpost.html
php 連 SQL Server和應用
php 5.3.3 連 SQL Server 2008 範例
http://leeycnote.blogspot.tw/2011/07/php-533-sql-server-2008.html
PHP教學 - 變數(Variables)
http://emn178.pixnet.net/blog/post/80119035-php%E6%95%99%E5%AD%B8---%E8%AE%8A%E6%95%B8%28variables%29
javascript 呼叫 php 變數
http://chia-ronglearn.blogspot.tw/2013/09/function-checkaccuser-do-ifuser-echo.html函數的回傳值
PHP5.x + sqlsrv
API 參考 (SQL Server Driver for PHP)
PDO (PHP Data Object) 簡易教學
PHP 連線 MSSQL 使用sqlsrv
php sqlsrv 要如何顯示出欄位名稱
php sqlsrv 如何顯示出欄位名稱
http://www.blueshop.com.tw/board/show.asp?subcde=BRD2012072008391998X&fumcde=FUM20041006152627A9N&odr=cdt&odrtyp=0
PDO
[php][pdo]取得總筆數、FROM DUAL WHERE NOT EXISTS
PDO
PHP PDO->query() 查询数据记录并返回查询结果
http://www.5idev.com/p-php_pdo_query.shtml[php][pdo]取得總筆數、FROM DUAL WHERE NOT EXISTS
2014年11月27日 星期四
2014年11月26日 星期三
Google Maps JavaScript API v3
地址查詢範例
https://developers.google.com/maps/documentation/javascript/examples/geocoding-simple?hl=zh-tw
經緯度查詢範例
https://developers.google.com/maps/documentation/javascript/examples/geocoding-reverse?hl=zh-tw
https://developers.google.com/maps/documentation/javascript/examples/geocoding-simple?hl=zh-tw
經緯度查詢範例
https://developers.google.com/maps/documentation/javascript/examples/geocoding-reverse?hl=zh-tw
地址轉換經緯度 C#及Javascript版本
http://www.dotblogs.com.tw/lastsecret/archive/2011/11/30/60183.aspx簡易Google地圖教學(Google Maps JavaScript API V3)
Google map API 經緯度與地址間的轉換
http://blog.yslin.tw/2013/02/google-map-api.html【Google Maps】(一) 初始化地圖與透過地址轉換經緯度重新定位地圖位置
http://elaine-iic.blogspot.tw/2013/03/google-maps-api.htmlGoogle Maps JavaScript API – 設定Marker
http://www.cellopoint.com/tw/media_resources/blogs/2014/07/googleGOOGLE MAP 的API使用(Javascript API)
http://blog.winwu.today/2012/03/google-map-apijavascript-api.html
jQuery tinyMap
tinyMap 操作範例
不動產實價登入
2014年11月25日 星期二
使用 OAuth 2.0 存取 Google API
使用 OAuth 2.0 存取 Google API
http://www.allenj.net/archives/4194
如何取得 Google Calendar 的日曆資料
是使用 JavaScript Library
主要步驟是
是使用 JavaScript Library
主要步驟是
- 在 API Console 建立一個 Project,開啟 Calendar API
- 在 Credentials,建立 OAuth 的 Client ID 及 Public API access 的 API key
- 使用 JavaScript Library,檢查 OAuth 驗證,及呼叫 Calendar Api 取得資料
用Google API来取得Google帐户的联系人列表 (PHP)
https://api.map.com.tw/GetAPI.asp
在PHP使用Google API(V3)取得使用者的Gmail通訊錄清單
http://blog.kejyun.com/2012/12/Using-Google-API-V3-To-Get-User-Contact-Email-Address-Book-List-On-PHP.html2014年11月21日 星期五
POST方法
PHP $_POST Function 使用方法詳細介紹
http://www.webtech.tw/info.php?tid=34
[PHP教學]PHP的表單變數傳遞POST篇
http://www.php5.idv.tw/html.php?mod=article&do=show&shid=54
找 function 傳post
php透過curl來傳送POST值
http://oomonkey.blogspot.tw/2013/12/phpcurlpost.html不使用 form 之下傳送 POST 變數
http://www.hkcode.com/programming/471
GET/POST 的差異與配合PHP用法
http://ithelp.ithome.com.tw/question/10155801
2014年11月17日 星期一
HTML5 CANVAS SAVE IMAGE
--------可以使用----------------
save html5 canvas to server
----------參考資料---------------
HTML5 CANVAS.TODATAURL SAVE IMAGE FILE
[PHP] 將 HTML5 Canvas 產生的圖片上傳至伺服器端處理
jQuery 網頁特定區塊的截圖外掛 html2canvas
App Inventor 2 指令中文化 Canvas 畫布
Qt3 Gossip: 簡單小畫家 - Qt 線上範例
一些常用工具
Canvas 方法
儲存Canvas為圖片且包含背景圖-How to save HTML5 canvas to image?
http://ricky9075.blogspot.tw/2013/07/canvas-how-to-save-html5-canvas-to-image.html
http://blog.darkthread.net/post-2011-11-01-save-canvas-todataurl-as-file.aspx
線上展示
http://www.darkthread.net/miniajaxlab/html5canvas/canvas1a.htm
Canvas教程(4):Using images應用圖像
[PHP] 將 HTML5 Canvas 產生的圖片上傳至伺服器端處理
CODE-Canvas.toDataURL()另存檔案案
線上展示
http://www.darkthread.net/miniajaxlab/html5canvas/canvas1a.htm
jQuery plugin - Signature Pad
How to save HTML5 canvas?
HTML5 canvas drawImage() 方法
HTML5 Canvas簡介
HTML5 Canvas Save Drawing as an Image
2014年11月11日 星期二
web.config加密組態檔
ASP.NET 2.0 筆記:加密組態檔
資料來源: http://www.dotblogs.com.tw/huanlin/archive/2008/04/23/3226.aspx
準備工作
先在 Visual Studio 2005 中建立一個 Web Site,假設建立在 D:\Work\Demo\EncryptWebConfig。接著在 web.config 中加入 appSetting 設定,參考以下範例:
加密組態檔
加密的方法是利用 .NET Framework 提供的命令列工具:aspnet_regiis.exe。首先,開啟程式集 > Microsoft .NET Framework SDK v2.0 > SDK Command Prompt,接著輸入以下命令:
aspnet_regiis -pef appSettings D:\Work\Demo\EncryptWebConfig
aspnet_regiis 的 -pef 參數是用來加密某個絕對路徑下的 web.config 的某個 section,因此除了指定要加密的區段(此例為 appSettings),還要指定網站的絕對路徑 (此例為 D:\Work\Demo\EncryptWebConfig)。
如果加密成功,會出現以下訊息:
Encrypting configuration section... Succeeded!
接著回到 Visual Studio 2005,檢視 web.config,原本的 元素的內容會變成類似下面這樣:
>configProtectionProvider="RsaProtectedConfigurationProvider"
這樣就完成加密的工作了。接下來看看如何在程式中讀取加密過的資料。
在程式中讀取加密過的組態
在程式中讀取加密過的組態設定資料,程式撰寫方式跟平常一樣。例如:
string s = ConfigurationManager.AppSettings["mySecret"];
我們完全不需要自行撰寫解密的程式碼,因為 .NET Framework 類別已經在背後幫我們自動處理掉解密的工作了。
解密組態檔
如果要將之前加密過的組態檔內容還原成加密之前的資料,可以使用 aspnet_regiis -pdf 命令,例如:
aspnet_regiis -pdf appSettings D:\Work\Demo\EncryptWebConfig
此外,你可以重複執行同一個加密或解密的命令。對一個加密過的區段再次加密,只會將原始資料重新加密,而不會將加密後的資料再重複加密一次;而對一個解密過的資料重複進行解密動作,也不會有任何影響。
aspnet_regiis 的其他加密參數
-pe 與 -pd 參數
在前面的簡單示範中,筆者使用的是 -pef 參數,此參數必須指定一個加密的區段名稱,以及要加密的網站的絕對路徑。你還可以使用 -pe 參數來加密組態檔,使用此參數時,通常會搭配 -app 參數來指定虛擬目錄的名稱,例如:
aspnet_regiis -pe appSettings -app /MyWeb
如果 -app 之後所指定的虛擬目錄是 '/',則會加密 IIS 網站的根目錄底下的 web.config。如果你沒有指定 -app 參數,那就會加密 .NET Framework 安裝目錄下的 CONFIG\web.config。
與 -pe 參數對應的解密參數就是 -pd,用法與 -pe 參數相同。
-prov 參數
在前面的範例當中,加密後的 appSettings 元素有一個 configProtectionProvider 屬性:
>configProtectionProvider="RsaProtectedConfigurationProvider"
這個屬性的用途是指定加密的提供者,從它的屬性值可以看出,這個提供者所使用的加密演算法是 RSA。你也可以使用 -prov 參數來指定使用其他的提供者,例如 DPAPI (Data Protection Application Programming Interface) ,參考以下範例:
aspnet_regiis -pef appSettings D:\Work\Demo\EncryptWebConfig -prov DataProtectionConfigurationProvider
使用 DPAPI 加密後的組態檔內容如下:
AQAAANCMnd8BF(略...)
若沒有指定 -prov 參數,預設就會使用 RSA 進行加密。
結語
本文簡單介紹了 ASP.NET 2.0 加密 web.config 的方法,以往開發人員必須自行撰寫加密解密的程式碼,現在只要使用 aspnet_regiis 這個命令列工具,執行一行命令就完成加密動作了。更棒的是,在程式中讀取加密過的資料完全不需要撰寫額外的程式碼,這些解密的過程都由 .NET Framework 類別幫我們在背後處理掉了。
另外,本文也提到了 RSA 和 DPAPI 兩種加密方式。根據 MSDN 文件的說明,如果你的網站會部署到多台伺服器上面以同時服務不同的用戶端,也就所謂的 Web farm 架構,那麼你應該要採用 RSA 的加密方式,因為這種方式可以讓你很容易的在多台伺服器之間匯出和匯入 RSA 金鑰(所有 Web farm 機器都要用同一把鑰匙,否則解密會有問題),若用 DPAPI 則很難確保所有機器都用同一把鑰匙。如果想要進一步了解 RSA 加密的應用,以及其他跟組態檔加密有關的議題,可以參考以下文章:
web.config 加密
http://blog.xuite.net/sugopili/computerblog/83661629-web.config+%E5%8A%A0%E5%AF%86
在 ASP.NET 2.0網頁程式中儲存敏感資訊的其中一個主要位置是 web.config檔,為了協助保護組態檔中的資訊,ASP.NET提供『受保護的組態』功能,該功能可讓您加密組態檔中的敏感資訊,而程式撰寫方式跟平常一樣,當要求網頁時,.NET Framework會解密連接字串資訊讓網頁程式使用。
aspnet_regiis.exe預設使用 RSA加密演算法對 web.config檔進行加密或解密資料,而加密金鑰儲存在『RSA金鑰容器』中,所以每台電腦有自己的加密金鑰,除非有匯入 RSA金鑰容器的私密金鑰,否則已加密 web.config檔只能給對 web.config檔進行加密的那台電腦使用。
對 web.config加密步驟:
1. 在命令提示字元中,輸入下列命令,將目錄變更為 .NET Framework 2.0版目錄:
cd \WINDOWS\Microsoft.Net\Framework\v2.0.*
1. 在命令提示字元中,輸入下列命令,將目錄變更為 .NET Framework 2.0版目錄:
cd \WINDOWS\Microsoft.Net\Framework\v2.0.*
2. 假設網站根目錄是 D:\XXX\YYY,則執行下列指令:
aspnet_regiis.exe -pef connectionStrings D:\XXX\YYY
對 D:\XXX\YYY\web.config檔的『connectionStrings』項目進行加密。
aspnet_regiis.exe -pef connectionStrings D:\XXX\YYY
對 D:\XXX\YYY\web.config檔的『connectionStrings』項目進行加密。
3. 授與 RSA金鑰容器的存取權限
在 ASP.NET對 web.config檔進行解密之前,ASP.NET應用程式的識別(Identity)必須擁有 RSA金鑰容器的讀取權。
在 Microsoft Windows 2000和 Windows XP Professional系統下,ASP.NET背景工作處理序的識別就是本機 ASPNET(ASP.NET Machine Account)帳戶,而 Windows Server 2003系統,預設為 NETWORK SERVICE帳戶。
在 ASP.NET對 web.config檔進行解密之前,ASP.NET應用程式的識別(Identity)必須擁有 RSA金鑰容器的讀取權。
在 Microsoft Windows 2000和 Windows XP Professional系統下,ASP.NET背景工作處理序的識別就是本機 ASPNET(ASP.NET Machine Account)帳戶,而 Windows Server 2003系統,預設為 NETWORK SERVICE帳戶。
Windows Server 2003系統下,其指令為
aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK SERVICE"
aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK SERVICE"
XP系統下(IIS 5.1),其指令為
aspnet_regiis -pa "NetFrameworkConfigurationKey" "ASPNET"
aspnet_regiis -pa "NetFrameworkConfigurationKey" "ASPNET"
如果沒有授與存取權限,則會出現以下錯誤訊息:
剖析器錯誤訊息: 無法使用提供者 'RsaProtectedConfigurationProvider' 解密。 來自這個提供者的錯誤訊息為: 無法開啟 RSA 金鑰容器。
剖析器錯誤訊息: 無法使用提供者 'RsaProtectedConfigurationProvider' 解密。 來自這個提供者的錯誤訊息為: 無法開啟 RSA 金鑰容器。
參考資料:
1. 使用受保護的組態加密組態資訊
1. 使用受保護的組態加密組態資訊
LOG製作方法
http://blog.kkbruce.net/2011/11/aspnet-mvc-log.html#.VGFhafmUdBH
ASP.NET MVC - 凡走過,必留下痕跡之LOG記錄
LOG記錄的方式
要留下Log記錄,基本方向可以有:- System Log記錄
- File Log記錄
- Database Log記錄
- Log Server
File Log記錄指的是透過 System.IO 寫一支程式,將你要的Log記錄到一個純文字檔,例如, FileLogs.txt,因為程式自己寫,你能控制什麼是你要,什麼是你不要,與System Log記錄相比,可以免除太大、太亂的問題。檔案太大還是有可能,這部分可能要寫程式自動處理,或是手動處理。
Database Log記錄,即將Log記錄直接記錄在Database之中,與System Log記錄與File Log記錄相較,Database本來就是儲存與管理資料所在地,而且與撰寫發送Windows Log記錄事件檢視器程式碼和File Log記錄程式碼來看,資料庫 Log記錄程式碼簡單多了。。
Log Server一般而言,是當伺服器群成長到一定數量,會架一台專門處理Log記錄的硬體伺服器,例如,Linux平台的Syslog,Windows下的Kiwi Syslog Server來架設,或是買專門機架硬體式Log Server,來統一收集、分析、管理這些Server Log記錄。
真是可大可小。
以下,我會使用 ASP.NET MVC來實作一個Database Log記錄範例。
DATABASE LOG記錄 - SCHEMA準備
針對我們檔案管理系統部分,我們會有兩張 Table,一張是記錄有權限的人員做了什麼動作,一張是記錄使用者下載了那些資料。KKBruceFileLog Schema
這是檔案下載的Log記錄表,要注意的只有 HiterIP 長度為 50,為什訂那麼長?我們事先把 IPv6 考慮進去。這樣,不管我們的 .NET Framwork 程式是抓到 IPv4 或 IPv6 ,記錄進資料庫都不會有問題。01 | -- 請切換至你的資料庫 -- |
02 | USE [KKBruce] |
03 | GO |
04 |
05 | /****** Object: Table [dbo].[KKBruceFileLog] Script Date : 11/08/2011 14:31:52 ******/ |
06 | SET ANSI_NULLS ON |
07 | GO |
08 |
09 | SET QUOTED_IDENTIFIER ON |
10 | GO |
11 |
12 | CREATE TABLE [dbo].[KKBruceFileLog]( |
13 | [FilesLogId] [ int ] IDENTITY(1,1) NOT NULL , |
14 | [FileId] [ int ] NOT NULL , |
15 | [HiterIP] [nvarchar](50) NOT NULL , |
16 | [CreateTime] [datetime2](7) NOT NULL , |
17 | CONSTRAINT [PK_FilesLogs] PRIMARY KEY CLUSTERED |
18 | ( |
19 | [FilesLogId] ASC |
20 | ) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [ PRIMARY ] |
21 | ) ON [ PRIMARY ] |
22 |
23 | GO |
24 |
25 | /* |
26 | 我的資料表裡有外來鍵及其他設定, |
27 | 你可以依需求設定,單純測試不需要。 |
28 | */ |
29 |
30 | /* |
31 | EXEC sys.sp_addextendedproperty @ name =N 'MS_Description' , @value=N '檔案編號' , @level0type=N 'SCHEMA' ,@level0name=N 'dbo' , @level1type=N 'TABLE' ,@level1name=N 'KKBruceFileLog' , @level2type=N 'COLUMN' ,@level2name=N 'FileId' |
32 | GO |
33 |
34 | EXEC sys.sp_addextendedproperty @ name =N 'MS_Description' , @value=N '檔案下載Log表' , @level0type=N 'SCHEMA' ,@level0name=N 'dbo' , @level1type=N 'TABLE' ,@level1name=N 'KKBruceFileLog' |
35 | GO |
36 |
37 | ALTER TABLE [dbo].[KKBruceFileLog] WITH CHECK ADD CONSTRAINT [FK_FilesLogs_Files] FOREIGN KEY ([FileId]) |
38 | REFERENCES [dbo].[ProductFile] ([FileId]) |
39 | GO |
40 |
41 | ALTER TABLE [dbo].[KKBruceFileLog] CHECK CONSTRAINT [FK_FilesLogs_Files] |
42 | GO |
43 |
44 | ALTER TABLE [dbo].[KKBruceFileLog] ADD CONSTRAINT [DF_FilesLogs_HitIPv4] DEFAULT (N '下載者IPv4' ) FOR [HiterIP] |
45 | GO |
46 | */ |
KKBruceEmployeeLog Schema
人員Log記錄表,記錄人員操作的任何動作,我們記錄登入人員的Id、動作、說明、IP、時間等資訊。另外補充,為了與 Entity Framework 有比較配合度,日期時間建議使用 datetime2 格式。01 | -- 請切換至你的資料庫 -- |
02 | USE [KKBruce] |
03 | GO |
04 |
05 | /****** Object: Table [dbo].[KKBruceEmployeeLog] Script Date : 11/08/2011 14:44:35 ******/ |
06 | SET ANSI_NULLS ON |
07 | GO |
08 |
09 | SET QUOTED_IDENTIFIER ON |
10 | GO |
11 |
12 | CREATE TABLE [dbo].[KKBruceEmployeeLog]( |
13 | [EmployeeLogID] [ int ] IDENTITY(1,1) NOT NULL , |
14 | [EmployeeId] [ int ] NOT NULL , |
15 | [ActionName] [nvarchar](250) NOT NULL , |
16 | [Description] [nvarchar]( max ) NOT NULL , |
17 | [ClientIP] [nvarchar](50) NOT NULL , |
18 | [CreateTime] [datetime2](7) NOT NULL , |
19 | CONSTRAINT [PK_KKBruceEmployeesLogs] PRIMARY KEY CLUSTERED |
20 | ( |
21 | [EmployeeLogID] ASC |
22 | ) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [ PRIMARY ] |
23 | ) ON [ PRIMARY ] |
24 |
25 | GO |
26 |
27 | /* |
28 | 我的資料表裡有外來鍵及其他設定, |
29 | 你可以依需求設定,單純測試不需要。 |
30 | */ |
31 |
32 | /* |
33 | EXEC sys.sp_addextendedproperty @ name =N 'MS_Description' , @value=N '人員Log記錄檔' , @level0type=N 'SCHEMA' ,@level0name=N 'dbo' , @level1type=N 'TABLE' ,@level1name=N 'KKBruceEmployeeLog' |
34 | GO |
35 |
36 | ALTER TABLE [dbo].[KKBruceEmployeeLog] WITH CHECK ADD CONSTRAINT [FK_EmployeesLogs_Employees] FOREIGN KEY ([EmployeeId]) |
37 | REFERENCES [dbo].[KKBruceEmployee] ([EmployeeId]) |
38 | GO |
39 |
40 | ALTER TABLE [dbo].[KKBruceEmployeeLog] CHECK CONSTRAINT [FK_EmployeesLogs_Employees] |
41 | GO |
42 | */ |
ASP.NET MVC實作LOG記錄
如果拿ASP.NET與ASP.NET MVC比較,要在 ASP.NET MVC裡實作Log記錄,老實說,沒有太大難度。因為ASP.NET MVC架構上非常容易實作與執行這一類程式碼。ASP.NET麻煩了些。什麼「這一類程式碼」?即需要「大量且重覆使用的程式碼」。在ASP.NET MVC裡有個機制稱 ActionFilter,就是專門在處理這種事,透過 ActionFilter 機制,我們可以很容易且簡單的去重覆使用我們的過濾器。因為我們要寫Log記錄,我們可以稱我們寫的為 Log ActionFilter、Log過濾器。
實作人員Log記錄
- 新增一目錄「ActionFilters」→ 新增一類別「EmployeeLogAttribute.vb」→ 繼承「ActionFilterAttribute 屬性類別」→ 覆寫「OnActionExecuting 副程式」。
EmployeeLogAttribute.vb
01 | Public Class EmployeeLogAttribute |
02 | Inherits ActionFilterAttribute |
03 |
04 | ' 由開發人員設定傳入相關Action的說明 |
05 | Public Property Description() As String |
06 |
07 | Public Sub New () |
08 | End Sub |
09 |
10 | Public Overrides Sub OnActionExecuting(filterContext As ActionExecutingContext) |
11 | ' 有使用者登入訊息 |
12 | If filterContext.HttpContext.User IsNot Nothing Then |
13 | Using db As New KKBruceEntities |
14 |
15 | ' 設定Log相關資訊 |
16 | Dim log As New KKBruceEmployeeLog() With |
17 | { |
18 | .EmployeeId = (From e In db.KKBruceEmployee |
19 | Where e.Account = filterContext.HttpContext.User.Identity.Name |
20 | Select e.EmployeeId).First(), |
21 | .ActionName = filterContext.RouteData.Values( "controller" ) & "/" & _ |
22 | filterContext.RouteData.Values( "action" ), |
23 | .Description = Me .Description, |
24 | .ClientIP = filterContext.HttpContext.Request.UserHostAddress, |
25 | .CreateTime = DateTime.Now.ToString() |
26 | } |
27 |
28 | ' 寫入資料庫 |
29 | db.KKBruceEmployeeLog.Add(log) |
30 | db.SaveChanges() |
31 |
32 | ' 邀免Log成長太大,保留六個月的Log |
33 |
34 | ' --- 補充 --- |
35 | ' 這一段會造成大量的Scan,Log越大,效能影響越明顯, |
36 | ' 原因在每個人員的每一個操作,我們就會執行一次這段程式, |
37 | ' 可在 Database 設定 Index、減少保留日期 … 來處理, |
38 | ' 或改使用排程來週期性的刪除。 |
39 | ' EF 效能考量,可參考MSDN: |
41 |
42 | Dim DeleteLogs = From logs In db.KKBruceEmployeeLog |
43 | Where logs.CreateTime <= DateTime.Now.AddMonths(-6) |
44 | Select logs |
45 |
46 | ' EF批次相關資料: |
49 |
50 | For Each DelLog In DeleteLogs |
51 | db.Entry(DelLog).State = EntityState.Deleted |
52 | Next |
53 | db.SaveChanges() |
54 | End Using |
55 | End If |
56 | End Sub |
57 | End Class |
如果你想測試這一段程式碼,你還必須建立會員登入相關資料表及程式碼才會運作。你可以先
- 註解第12 ( filterContext.HttpContext.User )、18 ( EmployeeId )、55 ( End If )行;
- 還有 KKBruceEmployeeLog Schema 裡的 EmployeeId 也必須把 NOT NULL 關鍵字移除。
使用Log ActionFilter
針對我們寫好的Log ActionFilter,使用有非常簡單,開啟你要設定的 Controller,然後在Action上設定 Log ActionFilter屬性。上傳檔案Log ActionFilter設定
01 | #Region "上傳" |
02 |
03 |
|
04 | Function Create(upfile As HttpPostedFileBase) As ActionResult |
05 | ' 略,請參考之前文章 |
06 | Return View() |
07 | End Function |
08 | |
09 |
10 |
|
11 | Function CreateMultiFile(form As FormCollection) As ActionResult |
12 | ' 略,請參考之前文章 |
13 | Return View() |
14 | End Function |
15 | #End Region |
有進到 HttpPost 代表有Submit,我們只需一一為相關Action設定好EmployeeLog及說明,然後測試一下相關動作,再到資料庫或另寫一頁顯示Log記錄的頁面查詢,應該就能看到如下Log記錄:
EmployeeLogID EmployeeId ActionName Description ClientIP CreateTime 1 1 Account/LogOff 登出系統 ::1 2011-06-30 11:22:49.0000000 2 1 Account/Index 查看員工資料 ::1 2011-06-30 11:23:56.0000000 3 1 Account/Edit 修改人員資料 ::1 2011-06-30 11:24:16.0000000 4 1 Account/Index 查看員工資料 ::1 2011-06-30 11:24:16.0000000 5 1 Account/Edit 修改人員資料 ::1 2011-06-30 11:24:28.0000000
檔案下載的LOG ACTIONFILTER
一般檔案下載是匿名的,當我們把 EmployeeLogAttribute.vb 裡取得會員資料相關程式碼註解後,就差不多是檔案下載的 Log ActionFilter,把「設定Log相關資訊」及Entity Framework對應的「資料表名稱」改一改即可。然後,設定到檔案下載相關 Controller/Action 去,即可。就算是採會員制,上面那個Log ActionFilter一樣寫好了,就拿去用吧!
一樣的東西,留給你去做。^_^
LOG記錄結論
System Log或IIS Log說真的,要看也沒幾個人看得懂,就算看得懂,要從數萬、數十萬、數百萬行裡找出問題點,那本身就是一件高難度任務。透過ASP.NET MVC裡的ActionFilter幫忙,讓我們很簡單且快速就完成有效的Log記錄,不論是稽核、分析、統計、舉證…都更有力,且存放於Database,不論是透過 SSMS 或網頁,我們都能快速的查詢我們所需的資訊。[ASP.NET]即時創建一個TXT文檔,並寫入資料
使用Asp.Net MVC打造Web Api (17) - 使用Nlog記錄系統訊息
http://ithelp.ithome.com.tw/question/10138479
訂閱:
文章 (Atom)