2014年12月26日 星期五

PHP function: 亂數密碼產生

http://blog.longwin.com.tw/2007/08/php_function_gen_password_2007/


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();
//下指令
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();
//仲介資料給GridView去顯示
GridView.DataSource = dr;
GridView.DataBind();
//若要讀取仲介的每一筆資料並丟給DropDownList
while (dr.Read())
{
    DropDownList.Items.Add(dr["dept"].ToString()); //dr["dept"].ToString() 是dr的dept欄位資料
}

2014年12月19日 星期五

讓checkbox、radio "唯讀"狀態

http://betray.pixnet.net/blog/post/24264932-%E9%80%9A%E9%80%9A%E4%B8%8D%E5%87%86%E5%8B%95%EF%BC%8C%E8%AE%93checkbox%E3%80%81radio%E9%81%94%E5%88%B0readonly



檔案上傳-中文檔名問題



PHP上傳~解決中文檔名問題


多檔案上傳

固定版面方法



https://www.ptt.cc/man/Web_Design/D44B/DDA2/M.1155359600.A.DED.html


[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%A1

http://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月2日 星期二

使用XMLHttpRequest

使用XMLHttpRequest


XMLHttpRequest執行AJAX 跨網域存取



AJAX 上手篇


php 連 SQL Server和應用


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->query() 查询数据记录并返回查询结果

http://www.5idev.com/p-php_pdo_query.shtml


[php][pdo]取得總筆數、FROM DUAL WHERE NOT EXISTS

2014年11月25日 星期二

使用 OAuth 2.0 存取 Google API

使用 OAuth 2.0 存取 Google API

http://www.allenj.net/archives/4194

如何取得 Google Calendar 的日曆資料
是使用 JavaScript Library
主要步驟是
  1.     在 API Console 建立一個 Project,開啟 Calendar API
  2.     在 Credentials,建立 OAuth 的 Client ID 及 Public API access 的 API key
  3.     使用 JavaScript Library,檢查 OAuth 驗證,及呼叫 Calendar Api 取得資料

用Google API来取得Google帐户的联系人列表 (PHP)





透過Gmail SMTP Server 發送信件(利用javamail API)

http://ptodue.blogspot.tw/2013/09/javagmail-smtp-server-javamail-api.html

需要包裝javamail API

參考:
  1. Guide to CSS support in email 
  2. How HTML email works, basic concepts, best practices, tips and tricks


2014年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?


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"
> xmlns="http://www.w3.org/2001/04/xmlenc#">

Rsa Key

z90mHvF2ckJWcNn(略...)

IGp7RWwbBkY2M2Bz5izbs(略...)


這樣就完成加密的工作了。接下來看看如何在程式中讀取加密過的資料。

在程式中讀取加密過的組態

在程式中讀取加密過的組態設定資料,程式撰寫方式跟平常一樣。例如:
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 加密的應用,以及其他跟組態檔加密有關的議題,可以參考以下文章:

  • MSDN 文章:Encrypting Configuration Information Using Protected Configuration
  • MSDN 文章:How To: Encrypt Configuration Sections in ASP.NET 2.0 Using DPAPI by J.D. Meier, Alex Mackman, Blaine Wastell, Prashant Bansode, Andy Wigley. Microsoft Corporation. July 2005
  • MSDN 文章:How To: Encrypt Configuration Sections in ASP.NET 2.0 Using RSA by J.D. Meier, Alex Mackman, Blaine Wastell, Prashant Bansode, Andy Wigley. Microsoft Corporation. July 2005
  • Create Export & Encrypt connection string on server and dev machine with ASP.Net 2.0



  • 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.*
    2. 假設網站根目錄是 D:\XXX\YYY,則執行下列指令:
        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帳戶。
        Windows Server 2003系統下,其指令為
        aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK SERVICE"
        XP系統下(IIS 5.1),其指令為
        aspnet_regiis -pa "NetFrameworkConfigurationKey" "ASPNET"
        如果沒有授與存取權限,則會出現以下錯誤訊息:
        剖析器錯誤訊息: 無法使用提供者 'RsaProtectedConfigurationProvider' 解密。 來自這個提供者的錯誤訊息為: 無法開啟 RSA 金鑰容器。

    LOG製作方法


    http://blog.kkbruce.net/2011/11/aspnet-mvc-log.html#.VGFhafmUdBH

    ASP.NET MVC - 凡走過,必留下痕跡之LOG記錄

    LOG記錄的方式

    要留下Log記錄,基本方向可以有:
    1. System Log記錄
    2. File Log記錄
    3. Database Log記錄
    4. Log Server
    System Log記錄指的是像IIS Log記錄就是System Log記錄。或撰寫程式碼,向Windows本身的事件檢視器來發送Log記錄。

    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-- 請切換至你的資料庫 --
    02USE [KKBruce]
    03GO
    04
    05/****** Object:  Table [dbo].[KKBruceFileLog]    Script Date: 11/08/2011 14:31:52 ******/
    06SET ANSI_NULLS ON
    07GO
    08
    09SET QUOTED_IDENTIFIER ON
    10GO
    11
    12CREATE TABLE [dbo].[KKBruceFileLog](
    13 [FilesLogId] [int] IDENTITY(1,1) NOT NULL,
    14 [FileId] [intNOT 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  = ONON [PRIMARY]
    21ON [PRIMARY]
    22
    23GO
    24
    25/*
    26我的資料表裡有外來鍵及其他設定,
    27你可以依需求設定,單純測試不需要。
    28*/
    29
    30/*
    31EXEC 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'
    32GO
    33
    34EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'檔案下載Log表' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'KKBruceFileLog'
    35GO
    36
    37ALTER TABLE [dbo].[KKBruceFileLog]  WITH CHECK ADD  CONSTRAINT [FK_FilesLogs_Files] FOREIGNKEY([FileId])
    38REFERENCES [dbo].[ProductFile] ([FileId])
    39GO
    40
    41ALTER TABLE [dbo].[KKBruceFileLog] CHECK CONSTRAINT [FK_FilesLogs_Files]
    42GO
    43
    44ALTER TABLE [dbo].[KKBruceFileLog] ADD  CONSTRAINT [DF_FilesLogs_HitIPv4]  DEFAULT (N'下載者IPv4')FOR [HiterIP]
    45GO
    46*/

    KKBruceEmployeeLog Schema

    人員Log記錄表,記錄人員操作的任何動作,我們記錄登入人員的Id、動作、說明、IP、時間等資訊。另外補充,為了與 Entity Framework 有比較配合度,日期時間建議使用 datetime2 格式

    01-- 請切換至你的資料庫 --
    02USE [KKBruce]
    03GO
    04
    05/****** Object:  Table [dbo].[KKBruceEmployeeLog]    Script Date: 11/08/2011 14:44:35 ******/
    06SET ANSI_NULLS ON
    07GO
    08
    09SET QUOTED_IDENTIFIER ON
    10GO
    11
    12CREATE TABLE [dbo].[KKBruceEmployeeLog](
    13 [EmployeeLogID] [int] IDENTITY(1,1) NOT NULL,
    14 [EmployeeId] [intNOT NULL,
    15 [ActionName] [nvarchar](250) NOT NULL,
    16 [Description] [nvarchar](maxNOT 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  = ONON [PRIMARY]
    23ON [PRIMARY]
    24
    25GO
    26
    27/*
    28我的資料表裡有外來鍵及其他設定,
    29你可以依需求設定,單純測試不需要。
    30*/
    31
    32/*
    33EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'人員Log記錄檔' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'KKBruceEmployeeLog'
    34GO
    35
    36ALTER TABLE [dbo].[KKBruceEmployeeLog]  WITH CHECK ADD  CONSTRAINT [FK_EmployeesLogs_Employees]FOREIGN KEY([EmployeeId])
    37REFERENCES [dbo].[KKBruceEmployee] ([EmployeeId])
    38GO
    39
    40ALTER TABLE [dbo].[KKBruceEmployeeLog] CHECK CONSTRAINT [FK_EmployeesLogs_Employees]
    41GO
    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


    01Public 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:
    40                http://msdn.microsoft.com/zh-tw/library/cc853327.aspx
    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
    57End Class

    如果你想測試這一段程式碼,你還必須建立會員登入相關資料表及程式碼才會運作。你可以先
    1. 註解第12 ( filterContext.HttpContext.User )、18 ( EmployeeId )、55 ( End If )行;
    2. 還有 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文檔,並寫入資料


    http://www.dotblogs.com.tw/shinyo.her/archive/2012/02/14/69206.aspx

    使用Asp.Net MVC打造Web Api (17) - 使用Nlog記錄系統訊息
    http://ithelp.ithome.com.tw/question/10138479