顯示具有 Microsoft 標籤的文章。 顯示所有文章
顯示具有 Microsoft 標籤的文章。 顯示所有文章

2010-11-22

如何自動回收 IIS 的 Application Pool


在IIS6 中,ASP.NET default 是跑在 worker process isolation mode

即,我們可以透過 Application Pool 的設定,讓不同的 ASP.NET 應用程式,跑在不同的 application pool中,由不同的 worker process 來處理,這樣的做法,可以避免將一個雞蛋放在同一個籠子裡,讓表現異常的應用程式,沒法影響到在其它Application Pool 中的程式

談到「異常」的應用程式...

有些人寫出來的APP就是莫明奇妙會掛點、Hang住、出問題~
積極的處理方式是做完整的測試、Code Review將問題查出並修正
消極的處理方式則是進行 IIS重啟(iisreset) 或 Application Pool Recycle(應用程式集區回收),看看有沒有辦法恢復正常

因使用IIS重啟是整個IIS都會被影響到,所以 可以就發生問題的Application Pool 進行回收 以降低影響範圍

Application Pool Recycle 這種被動的方式,除了可透過application pool 設定進行定期的回收外:


有時,我們可能想要透過一監測程式,在監測到有異常時,才執行application pool 回收
更甚者,我們可能在一台主機監測,而需要回收遠端主機的 application pool...

此時,主要可透過兩種方式來達成:

A. 透過 WMI 的方式, 我有 google 到下列的方式,但未試做:
http://gallery.technet.microsoft.com/ScriptCenter/en-us/22b10d93-e734-4fda-8ebe-2df30e54c64b
http://www.vistax64.com/powershell/103705-remote-application-pool-recycle-using-wmi-powershell.html
http://forums.iis.net/p/1033115/1421721.aspx

B. 透過 IIS 主機內建的 c:\windows\system32\iisapp.vbs 此 script,並搭配如 psexec 此類的遠端執行shell 指命的tool, 來達成:

iisapp.vbs 用法:

C:\>cscript c:\windows\system32\iisapp.vbs /a {ApplicationPoolName} /r

搭配 psexec 在 C# 程式中,可以用這種方式來達成遠端回收 application pool的效果:

Process process = new Process();
process.StartInfo.FileName = @"D:\PsTools\psexec.exe";
process.StartInfo.Arguments = @"\\{原端主機IP} -u {帳號} -p {密碼} cscript c:\windows\system32\iisapp.vbs /a {要回收的application pool name} /r";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
process.WaitForExit();

psexec 為 PsTools 內的一項utility,可在此下載


閱讀全文...

Axis2 與 .Net 1.1 Web Services 互通性問題


最近在實驗 Java Client to .Net Web Services 的互通性

Java 的部分,是使用 Apache 的 Axis 2

當我用 Axis 2 呼叫用 VS 2003 開發出來的 .Net 1.1 Web Services 時,總是會出現

Exception in thread "main" org.apache.axis2.AxisFault: Transport error: 404 Error: Not Found

百思不得其解,但使用 Axis 1 時,卻可正常呼叫

透過 WireShark 查知,Axis 2 在用 Http 傳送封包時,Transfer-Encoding 預設係使用 Http 1.1 規範裡新增的 Chunked Encoding 方式傳遞(HTTP Header -> Transfer-Encoding: chunked),而 Axis 1 則不使用 Chunked Encoding

因此,第一直覺,猜想是不是 IIS 的 metabase 設定中 ( C:\WINDOWS\system32\inetsrv\MetaBase.xml)AspEnableChunkedEncoding 這個設定值設成 FALSE 了? (Default 是 TRUE)

但 check 了一下,發現 IIS 有 enable Chunked Encoding

因此,就懷疑是不是 .Net Web Services 不直援 HTTP Chunked Encoding ?? 與用來開發的 .Net 版本有沒有關 ??

所以,就分別使用 VS 2003, 2005, 2008, 2010 製做 Web Services 來實驗

結果發現 不管 IIS 的 AspEnableChunkedEncoding 設定為何
VS 2003 開發出的 Web Services 是不能透過 Chunked Encoding 方式呼叫的
而 VS 2005 以上的版本開發出的 Web Services 則無此限制

因此,若使用 Axis 2 呼叫用 VS 2003 開發出的 Web Services 時,可以調整 Axis 2 呼叫時的參數,以正常呼叫 Web Services, 如下例(註: 我是使用 Axis2 預設的 "ADB Binding" -> XML to Object 的Binding方法啦):

Service1Stub stub = new Service1Stub(); stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED, Boolean.FALSE);
Service1Stub.HelloWorld hello = new Service1Stub.HelloWorld();
hello.setName("test");
System.out.println(stub.helloWorld(hello).getHelloWorldResult());

(註: 用 Eclipse 產生 Axis Web Services Client Project 時,目前預設是走 Axis 1, 若用 Axis2 附的 WSDL2Java 來產生 Web Services Stub 的話,則是走 Axis 2)

P.S. 這是我測試的結果啦~ 若大家有其它經驗 請再跟我分享 :)


閱讀全文...

2010-02-23

Notes: ASP.NET Diagnostics


1. Perfmon - windows 內建的 performance monitor

2. IIS Log + Log Parser -> 分析執行時間過長網頁
a. 加入 time-taken log 欄位
b. 安裝 Log Parser, 下 query 統計查詢:

logparser "select top 10 cs-uri-stem, time-taken from ex071105.log group by cs-uri-stem order by time-taken desc" -q:on

3. 安裝微軟 Debug Diagnostic Tool v1.1
a. 可透過 wizard 設定要監控的網址及效能門檻植,並在超過門檻時 進行相關process 的 memory dump, 並透過該工具內建的script 進行分析以產生報表 (可 check memory leak, application hang的問題)
b. 可自製 Debug Diagnostic Service 使用的 script ( C:\Program Files\DebugDiag\Scripts\DbgSvc.vbs) 來自定 trigger core dump 的時機,如 當 Performance Counter 中的 Request Execution Time 超過一定時限時,trigger core dump ),範例可見 C:\Program Files\DebugDiag\Samples\ControlScripts\PerfTriggers\ASPNETExecutionTime\DbgSvc.vbs

ref: http://blogs.msdn.com/debugdiag/

4. 透過 request based tracing

How to Trace Requests for a Specific URL or Set of URLs (IIS 6.0)
How to Create a Provider File for Request-Based Tracing (IIS 6.0)
How to Process and View Trace Log Files (IIS 6.0)



閱讀全文...

2009-09-24

Microsoft SQL Azure 連線方法(Cloud Computing, 雲端運算)


在前篇文章初淺的介紹了 SQL Azure(原名為 SQL Data Services) 及其申請方式

本篇文章,將介紹 SQL Azure 的連線方法

SQL Azure 提供 DB Service 方式,與 Amazon Web Services 的 Simple DB 類似,可以只用 Database 的 service (不過 存取的命令就不同了, Simple DB 是透過 REST or SOAP Interface, 而SQL Azure 則是透過 OLE DB/ODBC/ADO.NET 並透過 T-SQL 語法來存取)
而與 Google App Engine 的模式不同,Google App Engine 內建的 Database 不能單獨存取,只能透過佈署在 App Engine 上面的 Application 存取

既然可獨立存取,所以 想當然爾,運用 Microsoft Cloud Computing 開發 Web Application就會有兩種模式

A. Web Application 佈署在 Windows Azure, 並由 SQL Azure 提供 Database Services
B. Web Application 佈署在 自家環境, 並由 SQL Azure 提供 Database Services

然而,不管使用哪一種模式,Web Application 都是透過傳統 SQL Server 的 1433 port 來存取SQL Azure

所以囉,若是 Web Application or Developer 在 firewall 裡面,對外的連線被管制的話,那麼 使用上述 A 模式會是比較便於開發的

在前篇章提到,若是成功申請 SQL Azure Services後,會提供你三種連線方式的 Connection String



不管是哪一種,簡單來講 該 services 就是 listen 在
tcp:servername.ctp.database.windows.net:1433 這個位置

只要你用對連線的方法 (ODBC, ADO.NET, OLE DB) 且對外的網路通暢,應該就能順利存取

1. 初次使用,最常試的應該會用現有的 SQL Server 2008 SSMS 管理工具來連結,雖然 SQL Azure 與 SQL Server 並不完全相容,但是 使用 SSMS 還是可以順利連上

只要在連線至伺服器處(Connect to Server)
server name的地方輸入 [你的sql azure server name].ctp.database.windows.net
帳號則是要輸入 [你的sql azure帳號]@[你的sql azure server name]

連進去後,會出現一些錯誤訊息 (這是因為 有些功能 SQL Azure 與 SQL Server不相容),不要理它
進去後雖然 object explorer 不能用,不過 可以透過 新增查詢(new query) 的方式來進行 SQL command 的下達,這是沒問題的

step-by-step 的操作,可以參考 http://blogs.msdn.com/jimoneil/archive/2009/08/18/sql-azure-ctp-1.aspx

b. 可以使用 SQLCMD 這個 DOS 下的工具來做連線及管理
這個工具位於你 local 的 SQL Server 安裝位置的 \Tools\Binn 資料夾下

以下是簡單的 demo:

連線:

sqlcmd -S [servername].ctp.database.windows.net -U [username]@[servername] -d [database name]
密碼:

下命令:

1> -- 先建立 table, 注意 在 SQL Azure 上面的 table, 一定要有 clustered index
2> -- 這應該是因為 SQL Azure 會自動幫你做 table partitioning 以提供 scalability 能力的緣故
3> create table jobs
4> (
5> job_id smallint identity(1,1) primary key clustered,
6> job_desc varchar(50) not null
7> )
8> go
1> -- 塞一些簡單的資料
2> insert into jobs(job_desc) values('manager: this is job titled manager')
3> go

(1 個受影響的資料列)
-- Query
1> select * from jobs
2> go
job_id job_desc
------ --------------------------------------------------
1 manager: this is job titled manager

(1 個受影響的資料列)
1>

3. 透過 ODBC 的方式連結,使用 windows 的 ODBC 資料來源管理員
一樣,輸入 server 位置、帳號、密碼後 進行連線
只是,在進行連線測試時 要嘛就出現「網路錯誤」的message 又嘛就出現類似下例的錯誤,
所以 個人目前使用 ODBC 連線 是沒有成功過的

Microsoft SQL Server ODBC 驅動程式版本 03.86.3959

執行連線測試...

試圖連線
連線已建立
查證選項設定
[Microsoft][ODBC SQL Server Driver][SQL Server]Built-in function 'databasepropertyex' is not supported in this version of SQL Server.
與伺服器中斷連線

測試失敗!

4. 透過 ADO.NET 來連線,只要 connection string 的設定正確,是可以正常用 ADO.NET 來存取到的,但如果你是在公司內部開發,那麼要注意對外連線 1433 port 是否有被 firewall 阻檔

5. 透過 3rd party tool
可能是目前很多人遇到 SQL Azure 的連線問題,所以 有個公司開發了一個 Web 的小工具,透過它來連線到您的SQL Azure Server Instance

這篇文章是這個工具的使用介紹: http://www.cerebrata.com/Blog/post/Browser-based-SQL-Azure-Explorer.aspx

基本上,只要先連到 https://onlinedemo.cerebrata.com/SQLAzureClient/default.aspx
輸入:
database name:
username:
password:

後,就會透過該介面連到您的 SQL Azure Server
好處是,因為是 透過該網站中介連過去的,所以 就算你人在 firewall裡面,還是可以透過這個圖形化的工具來管理
壞處當然就是,因為是透過對方中介,所以 你的 帳號、密碼以及中間的使用過程 都能很輕易的被該中介站給攔劫使用

所以,若是要拿來做非測試的用途,還是不建議使用這樣的方式,資安的風險會較高


畫面如下:








* 相關文章: Microsoft SQL Azure 初步介紹及申請


閱讀全文...

2009-09-23

Microsoft SQL Azure 初步介紹及申請(Cloud Computing, 雲端運算)


繼 Amazon Web Servcies 提供的 EC2, S3, ... 、 Google App Engine(GAE) 提供的 cloud computing(雲端運算)平台後,Microsoft 也開始準備提供類似的服務
其中,包含主要可佈署 ASP.NET Application 的 Windows Azure、.NET Services 及 SQL Azure.. 等

其中,SQL Azure 主要是提供傳統的 SQL Server 服務,只是 運算資源及管理平台 都統一由 Microsoft 來提供,也就是說 使用者向微軟申請 SQL Azure 的服務後,微軟會在他的 cloud computing 環境當中,為你建立一個 SQL Azure Server instance 並提供你使用,當然 該 SQL Azure Server 也是透過 port 1433 來存取的 只是SQL Azure Server 的版本較為客製化,連線及使用的方式 會與傳統使用 SQL Server的方法有點小小的差異,至於該 SQL Azure Server 所需的硬體、軟體資源、機房、頻寬的管理 都統一由 Microsoft 負責,未來正試使用後 會依你的使用量來收費(Utility Computing 的觀念,未來應該會依 DB 使用量、Query 數量、CPU使用量... 等值來做對應的收費)

下列先介紹 SQL Azure 的申請方法:

1. 至 http://www.microsoft.com/azure/register.mspx 申請 SQL Azure 的 CTP (Community Technical Review) 使用權

2. 申請完後,Microsoft 會寄一封含試用碼(invitation code)的信件給你,內容大概如下

1) Visit https://sql.azure.com
2) Sign in with a valid Windows LiveID
3) Enter your invitation code
Your invitation code is: 6fb28cf2-xxxx-xxxx-xxxx-a098ae31807a
4) Create your SQL Azure Server (and databases)

3. 依信件指示,login 至 https://sql.azure.com, 登入後畫面類似如下
在第一次登入時,會讓你輸入 invitation code 並以建立一個 SQL Azure Server instance, 其中有一些 管理者帳號、密碼以及這個 SQL Azure instance放置的地點... 等選項需設定
(目前只提供 USA 這個地點供選擇,未來應該會提供各地域,供你選擇網路距離較近的 Server,亦會提供多地域的 clustering 的機制)



4. 上述畫面,按 manage 則可開始管理這個 Microsoft 提供給你的 SQL Azure Server instance
在畫面上,你會看到 微軟提供給你的 server name
未來,要存取這個 SQL Azure Instance 的話,就統一會透過 servername.ctp.dat
abase.windows.net port 1433 來存取



5. 上述畫面可以 建立、刪除 該 instance 上面的 database, 但目前也僅有這樣的功能
其它針對 database 的管理( table creation, view, stored procedure, trigger, ... 等等的建立)都需透過SQL Azure 提供給你的 connection string 透過外部的tool或程式來進行管理

目前提供三種連結方式: ADO.NET, ODBC, OLE DB
但 很遺憾的 目前若要直接用 SQL 2008 的 SSMS 來管理的話 表面上會預到一些小問題,但實際上是可以用的
用 ODBC 連的話,個人在家裡 是還沒成功連上過
ADO.NET 確定沒問題
在下一篇文章內,將會介紹用 SSMS 以及 SQLCMD 來連線管理的方法。



* 相關文章: Microsoft SQL Azure 連線方法


閱讀全文...

2009-05-12

MS SQL Table 佔用空間計算


同事提供的方法,
主要是利用到內建的 stored procedure: sp_MSforeachtable

---

CREATE TABLE #TableSizes
(
table_name SYSNAME,
row_count int,
reserved_size varchar(10),
data_size varchar(10),
index_size varchar(10),
unused_size varchar(10)
)
INSERT #TableSizes EXEC sp_MSforeachtable 'sp_spaceused ''?'''
SELECT table_name,row_count, replace(reserved_size,' KB','') reserved_size,replace(data_size,' KB','') data_size, replace(index_size,' KB','') index_size, replace(unused_size,' KB','') unused_size FROM #TableSizes ORDER BY table_name
drop table #TableSizes
go


閱讀全文...

2009-05-08

.Net Connection Pooling 問題 - (.Net 1.1 一般網路錯誤/ .Net 2.0 在傳送要求至伺服器時發生傳輸層級的錯誤。 (provider: TCP 提供者, error: 0 - 遠端主機已強制關閉一個現存的連線。)


偉哉 微軟~

透過 .Net default Connection Pooling 機制存取 DB

會有問題,其實不是一天兩天的事了

網路上的論壇 也有提到 這樣的問題 已經三、四年了 但是 一點兒也沒有解決的辦法 亦無一通用的說明及解決方法

在 .Net framework 中,使用connection pooling機制存取DB,依不同 framework 版本 又分下列兩種一般的錯誤訊息:

.Net Framework 1.1 -> 一般網路錯誤
.Net Framework 2.0 -> 在傳送要求至伺服器時發生傳輸層級的錯誤。 (provider: TCP 提供者, error: 0 - 遠端主機已強制關閉一個現存的連線。)
System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) ....

其實,軟體本身就是 unreliable 的東西

若是一味的依錯誤訊息 斷定是硬體、網路的問題 這樣或許太偏執

以上述的訊息來看,一樣的senario 不一樣的 .net framework 居然丟出這樣不同的訊息
就是 .net framework 的一個問題


再者,明明不是網路問題 卻丟出網路錯誤的message 更是該打屁股

以下聽我道來:

* connection pooling 的美意是因為connection的建立cost非常的高,若能reuse 已建立好的connection,則可省下許多的運算資源

* .NET default 就會 by application domain, connection string 有自動的connection pooling機制
只要是在同一 Application Domain下、擁有相同connection string的 connection,
都會share同一connection pool (default: MIN Pool Size=0; MAX Pool Size=100)

* .Net connection pooling 並沒有檢查 connection pool 中 既有connections有效性的機制
透過以下lab實驗,可以證明這件事
a. 透過 .net client 程式透過connection pooling機制query db,可以讓 pool 中保持一定的connection
b. 在 SQL Server 端,將對應的connection 殺掉(透過 kill)
c. 再透過 .net client 程式透過connection pooling機制query db,偉大的.net 就會依framework版本,吐出上述兩種不同的訊息(都跟網路錯誤有關)

* 由以上小實驗可知,.net framework 的訊息 容易讓developer 誤解,以為 是網路的不穩定,但 實際的原因則是,connection pool 裡的connection 本來就不保證一定是可用、沒問題的

* .Net Framework 並不保證 也不會maintain connection pool 內的connection的正確性

其實,我也是深受其害 才會來做這些驗證的實驗的...

以下是當你遇到這個問題時,建議的解決方法:

1. handle sqlclient 的 exception 並適時加入 retry 或其它exception handling的作業
正解
software is unreliable, 既然有 exception 發生的可能性,為何不 catch 它,而要任由它throw出來
殊不知,thrown exception 的 cost 比 handle exception 的 cost 大上十倍以上
且,加上 exception handling code, 在不發生 exception 的狀態下,根本對程式的performance沒影響
百利而不一害~ 幻想偉大的programmer 們~ 為何不去 handle 它呢 ?

2. 避開它, 不使用connection pooling 機制
停用 connection pooling 的機制(在 connection string 上,加上Pooling=false)
既然不用該機制,當然也就不會有該問題發生啦 :)
不過,這是消極的做法,必竟 不做connection pooling 是會降低一些performance的,
尤其是您的系統是忙碌的線上系統時

3. 調整Connectoin String中 Connection Lifetime 參數 (default 是 0, 即 不主動回收)
透過connection lifetime,把一段時間未使用的connection 進行 release 可以降低 long connectoin可能造成的問題,亦可在 traffic burst(尖峰時段) 時段有pooling, reuse-connection的效果
BTW, 這個值 還要再試驗; 另外,exception 還是要handle 的啦~

Connection Lifetime

0

When a connection is returned to the pool, its creation time is compared with the current time, and the connection is destroyed if that time span (in seconds) exceeds the value specified by Connection Lifetime. This is useful in clustered configurations to force load balancing between a running server and a server just brought online.

A value of zero (0) causes pooled connections to have the maximum connection timeout.


下面是我做的另一個實驗,這更加深了我對 .Net connection pooling 機制的懷疑:

測試原理: 透過簡單的 test driver, 分別以 使用connection pooling、不使用connection pooling的狀況下,在一定的間隔,對Database做簡單的操作 (如: select N'ok')

測試設備: 3台
測試時間: 2天
測試架構: test driver -> web farm(3台設備) -> switch -> clustered DB Server
測試結果: 不用connection pooling 錯誤率 0%
使用connection pooling 錯誤率依測試間隔 往上飆高


以上~ 供各位參考

強調: 這只是在我的實驗環境裡的結果,或許有其它設定值的因素 導致這樣的結果


閱讀全文...

2009-02-18

IIS6 + Tomcat6 設定方法


1. 先有IIS

2. 安裝JDK
- download JDK and install
- set JAVA_HOME 環境變數至 jdk 安裝目錄

3. 安裝 Tomcat
- download Tomcat and install
- set CATALINA_HOME 環境變數至 Tomcat 安裝目錄

a. 首先先依上述連結下載取得 isapi_redirect-1.2.27.dll (目前最新版本)
b. 將該dll置於一特定目錄 (如: c:\TomcatConnector)
c. 在該目錄下 建立三個config file 分別為
isapi_redirect-1.2.27.properties (主檔名與 isapi_redirectxxxx.dll 的主檔名同)
workers.properties
uriworkermap.properties
d. 下述是我針對三個檔案的設定 (可在tomcat網站看到how-to說明及這些檔案的定義)
基本上,除 uriworkermap.properties 外的兩個檔案 都大概變動不大
uriworkermap.properties看名字跟內容就知,是用來設定哪些URL Pattern
是IIS要透過此connector交由tomcat處理的

isapi_redirect-1.2.27.properties
# Configuration file for the Jakarta ISAPI Redirector
# The path to the ISAPI Redirector Extension, relative to the website
# This must be in a virtual directory with execute privileges
extension_uri=/jakarta/isapi_redirect-1.2.27.dll

# Full path to the log file for the ISAPI Redirector
log_file=c:\TomcatConnector\isapi_redirect.log
# Log level (debug, info, warn, error or trace)
log_level=debug
# Full path to the workers.properties file
worker_file=c:\TomcatConnector\workers.properties
# Full path to the uriworkermap.properties file
worker_mount_file=c:\TomcatConnector\uriworkermap.properties

workers.properties
worker.list=wlb
worker.wlb.type=ajp13
worker.wlb.host=localhost
worker.wlb.port=8009

uriworkermap.properties
/examples/*=wlb

5. 設定IIS
a. 設定網頁服務延伸


b. 在站台上加入ISAPI filter

c. 在IIS站台上新增一虛擬目錄,命名為 jakarta 指向 Tomcat connector存放的位置
(本例為: c:\TomcatConnector),這個動作 對應到
isapi_redirect-1.2.27.properties 此設定檔內的下列設定:
extension_uri=/jakarta/isapi_redirect-1.2.27.dll

d. 注意,check download 下來的 isapi_redirect-1.2.27.dll 有無被 windows 封鎖


6. restart tomcat & iis

7. 連到 http://localhost:8080/examples 與 http://localhost/examples
check IIS 是否真的把符合 /exmaples/* 的 URL request 都餵給tomcat處理

8. 恭喜~ 大功告成

9. 後記: Tomcat網站上 說明有點遺漏
a. dll 可能被block的問題 官網上沒說明到
b. 除了 IIS 網頁服務延伸設定外,在 IIS 站台上 也要設定對應所使用的ISAPI位置
c. 官網上提供修改 windows registery的做法來記錄
workers.properties、uriworkermap.properties這些重要設定檔的位置
另外也提到可以在該 ISAPI dll 所在位置建立一isapi_redirect-1.2.27.properties
存放設定檔位置
當然~ 用第二種方法 感覺比較容易 :)


閱讀全文...

2009-02-11

ASP.NET AJAX Framework 過於肥大之問題解決方案 (ScriptMode, ScriptingScriptResourceHandler)


專案內的同仁,有使用 VS 2005 or VS 2008 進行 ASP .NET的 Web 開發作業
其中,亦有引用到 Microsoft 提供到的 ASP.NET AJAX Framework 功能
在實際上線的過程中,卻發現 該 AJAX Library異常的肥大(與 jQuery, Prototype, YUI ...等相比)
可能會影響到 client 端針對該 js file之 download time
所以,針對此議題 內部做了一些survey,就 .Net 提供的 javascript file之size縮減方案分別可就 java script file本身size縮減及http transport layer之壓縮技術說明如下:

1. ASP.NET AJAX Framework Java Script file size 縮減

參考 MSDN 文件說明: http://msdn.microsoft.com/en-us/library/bb344940.aspx
可知,透過 Web.config 內的 ScriptMode 及 Compilation Debug 兩個設定值,決定提供予client端下載的script版本

- debug 的版本 可能debug的資訊比較完整,且 js 檔案不會將空白、換行移除 (未壓縮前的size大)
- release的版本比較精簡 但,所提供的 function 應該都是一樣的 (未壓縮前的size小)

參考資訊:
ScriptManager Class: http://msdn.microsoft.com/en-us/library/system.web.ui.scriptmanager.aspx
ScriptMode Enumeration: http://msdn.microsoft.com/en-us/library/bb344940.aspx


2. HTTP Compression

透過HTTP Compression的技術,在傳輸層進行壓縮,以達到傳輸資料量縮減的目的
前提是,client端的browser要支援gzip or dflate的解壓縮功能(此部分,.Net 係透過client端送出的http request header內容來判斷對http compressoin壓縮的支援度)



此部分,看來 MS知道自已的 JS Library真的太肥了,所以預設值即是啟用壓縮
若要將壓縮功能關閉或是想要知道更細部的資訊,可參照下列資訊

ScriptResourceHandler Class: http://msdn.microsoft.com/en-us/library/system.web.handlers.scriptresourcehandler.aspx
ScriptingScriptResourceHandlerSection.EnableCompression Property: http://msdn.microsoft.com/en-us/library/system.web.configuration.scriptingscriptresourcehandlersection.enablecompression.aspx


閱讀全文...

2009-02-02

Office Addin 開發經驗 (using VSTO)


因為Office為常用的辦公室軟體工具
懶得做重複事情的我 當然會想看看 到底有沒有辦法在 Office 的應用裡面 加上我自已的功能
用來處理一些很Routine、重複操作的事情 ?

其實 以前已經有使用 VBA 來客製化 Excel, Word 的功能

不過,必竟 VBA 的 DEBUG 相當的麻煩,且開發環境較不便利、語言也較不熟悉

所以,找到了另一個方法

透過 VSTO(Visual Studio Tool For Office Development)這工具
即可透過 VS 2005 用自已喜歡的語言 來開發 Office Addin

*** 開發的過程中,只要新增一個 Office Addin 的專案,再依 office object model (寫的很差的一堆文件)來開發即可



*** 安裝的過程,會比較麻煩,先簡單列出我遇到的問題
1. 開發時 用Debug mode執行的話,addin 可順利裝至 outlook

2. 開發完時,用 install 的 .msi 檔案 install 完後啟動outlook,發現 addin 無法順利載入,但又無對應的 Error Message 用來除錯,經過我在網路上尋找一些答案後,就我遇到的問題,分別說明解法如下:

a. DEBUG方法: 在 deploy 到 outlook 測試時,若 addin 有問題 or 無法載入,其實 根本看不到啥錯誤訊息,此時 可在系統環境變數加上,相關的訊息就會 show出、Log起來,這個功能 實在非常有用哦 :)

SET VSTO_LOGALERTS = 1
SET VSTO_SUPPRESSDISPLAYALERTS = 0

b. Client 要安裝 Microsoft Visual Studio 2005 Tools for Office Runtime
否則,outlook 沒有辦法存取要 load addin 用的 proxy 檔案
C:\Program Files\Common Files\Microsoft Shared\VSTO\8.0\AddinLoader.dll

Download Url: http://www.microsoft.com/downloads/details.aspx?familyid=F5539A90-DC41-4792-8EF8-F4DE62FF1E81&displaylang=en

c. Client 端的Office要安裝 .Net 程式設計支援 (安裝 office 時 預設沒裝)
否則,會遇到 遇到下列問題: Could not load file or assembly 'Microsoft.Office.Interop.Outlook, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' or one of its dependencies. 系統找不到指定的檔案。



d. Client 要grant(允許) 該 addin 的執行,以我為例 我是到 .Net Framework 2.0 的目錄下,下這樣的 command

---> cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>
---> caspol -u -ag All_Code -url C:\Program Files\USR\MinChuan_OutlookAddinSetup\* FullTrust -n "MinChuan_OutlookAddin" -d "This is MinChuan_OutlookAddin"

否則 會遇到下列問題:
Could not load file or assembly 'MinChuan_OutlookAddin, Version=1.0.0.0, Culture=neutral,

PublicKeyToken=null' or one of its dependencies. Failed to grant permission to execute. (Exception from

HRESULT: 0x80131418)

e. Client 要安裝 .Net Framework 2.0

*** 參考資料 ***

  • MSDN 裡面, search VSTO or outlook, excel, word ... 等,可以找到一些範例


閱讀全文...

2008-12-29

Outlook Automation


因為gmail實在太強了 所以 想把所有的信 都用gmail的當做備份+搜尋的地點

因為,公司的mail 有自動轉寄功能

所以,先前設定所有寄給我的信 都會轉到我的 gmail 帳號一份

但是,針對自已寄出的信 就沒輒了~

基本上 想的方式是這樣:

* 每次寫信 or 回信時 把 gmail account 加到 BCC 內 再寄出

不過,每次都要加 也很煩人(且 outlook 要加 bcc 比較麻煩)

so, 就想說 excel 的 macro 有沒有辦法做到

基本上,就滿簡單的

基本想法如下:

方法A: 自訂寫信、回信的功能,在 outlook 裡面 去定義 macro並編輯它
會進入 VBA 的程式寫作介面,在裡面 去定義macro要做什麼事
舉例來講,我定義了這樣一個函式後,再到 outlook 工具->自訂->指令 把這function加入 outlook 的 menu,以後 我只要點這按鈕,就會啟動一個新信件編輯視窗,並且 default就有bcc 自已~ 很簡單吧

Sub MinChuanNewMail()
Set myOlApp = CreateObject("Outlook.Application")
Set myItem = myOlApp.CreateItem(olMailItem)
myItem.BCC = "minchuan@cht.com.tw"
myItem.Display
End Sub

不過,回信的部分 要處理 就要再研究一下

方法B: handle outlook 發信的 event - 在 發信前 將 gmail account 加到 bcc

基本上,針對 ThisOutlookSession 這個 Application object的 event 進行 handle 就行了
像是這樣:

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
Item.BCC = "minchuan.wang@gmail.com"
End Sub

夠簡單吧!!

不過,這個有一個問題
Default 這樣的巨集 會被outlook停用 ><~
所以 暫時解法是 將 macro 的信任等級調低
不然,就可能要透過 macro sign 的機制,把macro簽署過 這樣outlook 才會信任 :Q

--
reference: http://msdn.microsoft.com/en-us/library/aa246142(office.11).aspx


閱讀全文...

2008-11-04

WSS 客製方法 (Windows Sharepoint Services)


專案使用了 Windows Sharepoint Services 已經有五年的時間了

最初是我建置+管理

目前 已經將它移交給別人管帳號跟系統

最初只有 for 單一個 project 使用

但,又不想使用 MS 提供的畫面及Template,所以 在 93年時,用硬幹的方法
修改MS的aspx檔案:
C:\Program Files\Common Files\Microsoft Shared\web server extensions\60\TEMPLATE\1028\STS\default.aspx

把它改成這樣:



在 WSS 當中,有主網站、子網站的功能

主網站目前是 for GSP Project 使用
子網站曾經有提供給 GSN 使用
目前要再加一個「農委會客服」的案子

但是,專案一多 這單一個客製檔案 沒辦法 for 其它專案使用

偏偏,WSS 又無提供為每個 Site, SubSite 客製首頁的功能(要做到很細 不是只有加 Web Part而已...)

因為目前我們的 WSS 我已經把它轉到 VM 上,最初的想法 是想透過 VM 的複製,針對每個Project就給它一個 VM,也實際做出來了
但是,VM 還是要有管理、上Patch、甚至申請public / private IP 的需求
會加重原本系統管理的負擔

so, 最後 終於試到一個辦法, 使用 office front page extension 的方式,居然可以直接針對子網站去做網頁的編輯

這大概是最適當的作法了 :)

下面這個 site, 就是我下午客製出來的哦 :)


閱讀全文...

2008-11-03

MS SQL Server 2000 Audit


最近因為公司的資安查核,所以 研究了一下 MS SQL Server 2000 要如何建立稽核軌跡(Audit Trail),大概找了幾類的方法,整理說明如下:

------------------------------------------------------------------
A. enable SQL Server login audit (through SQL Server Enterprise manager)
------------------------------------------------------------------

ref: http://www.microsoft.com/technet/security/prodtech/sqlserver/sql2kaud.mspx

notice: SQL Server 要重啟才生效
login audit 資訊會寫在 windows 的 app event log 裡

1. 在這個畫面做設定,安全性 -> 選要做 Login 的稽核層級為何



2. 重啟SQL Server

3. 接著,後續的login記錄,就會記錄在 windows event log 內 (歸於 application這個類別)



------------------------------------------------------------------
B. enable SQL Server 「c2 audit mode」:
------------------------------------------------------------------

ref: http://www.microsoft.com/technet/security/prodtech/sqlserver/sql2kaud.mspx

SQL Server 內建有一 C2 audit mode, 預設是沒打開的

打開方式如下:
1. 在 command mode 裡下下列的指令
C:\Documents and Settings\Administrator>osql -E
1> exec sp_configure
2> go

1> exec sp_configure 'c2 audit mode','1'
2> go
DBCC 的執行已經完成。如果 DBCC 印出錯誤訊息,請聯絡您的系統管理員。
設定選項 'c2 audit mode' 從 0 變更到 1。請執行 RECONFIGURE 陳述式來安裝。
1> reconfigure
2> go

2. 重啟 SQL Server
3. 接著,SQL Server即會以 c2 的標準做 log, log 檔會以 .trc (trace)存在
C:\Program Files\Microsoft SQL Server\MSSQL\Data 下
4. .trc 可用 sql profiler 來看
5. 目前正在錄的 .trc 無法直接開,可先將 sql server restart 後,該 .trc 即可開啟
.trc 檔會做 log rotate,被rotate 掉的 .trc 也可以直接開來看

效果如下,可以稽核 對DB的一些Command及登入資訊,不過使用這種方式要注意,它可能會拖慢DB的速度,所以若要打開此選項,一定要先測試過,看看目前的交易量及設備容不容許將這選項打開。



另外,何謂 C2 等級的 audit log?

根據美國國防部的一個標準:
DoD 5200.28-STD, "Department of Defense Trusted Computer System Evaluation Criteria"
http://www.boran.com/security/tcsec.html
有將電腦系統依安全的程度,分為下列等級,C2即是其中的一級:

* DISCRETIONARY PROTECTION
Class (C1): Discretionary Security Protection
Class (C2): Controlled Access Protection
* MANDATORY PROTECTION
Class (B1): Labeled Security Protection
Class (B2): Structured Protection
Class (B3): Security Domains
* VERIFIED PROTECTION
Class (A1): Verified Design
Beyond Class (A1)

C2何底要求為何,依該標準,簡述如下:
Systems in this class enforce a more finely grained discretionary access
control than (C1) systems, making users individually accountable for their
actions through login procedures, auditing of security-relevant events, and
resource isolation.
實際的要求,要來的細的多,要參考該標準文件才行。

------------------------------------------------------------------
C. 使用 Server Side Trace 的功能 來客制 trace 有興趣的 sql server operation
------------------------------------------------------------------

ref: http://www.microsoft.com/technet/security/prodtech/sqlserver/sql2kaud.mspx
(與 SQL Profiler 原理一樣)

其實,這就好像用 SQL Profiler 一樣,選自已有興趣的event,來錄製相關的

上述的 C2 log 也是用一樣的原理,差別在於 C2 audit log 是 SQL Server建好的套餐

如果覺的那樣的 log 太多了,則 你以用 server side trace 的方式,來挑想log的部分記錄即可

------------------------------------------------------------------
D. 使用 DBCC command --> 但是 結果很難看.. 不是人可以看的
------------------------------------------------------------------

指令: DBCC log ( {dbid|dbname}, [, type={0|1|2|3|4}] )

PARAMETERS:

Dbid or dbname - Enter either the dbid or the name of the database in question.

type - is the type of output:

0 - minimum information (operation, context, transaction id)
1 - more information (plus flags, tags, row length)
2 - very detailed information (plus object name, index name, page id, slot id)
3 - full information about each operation
4 - full information about each operation plus hexadecimal dump of the current transaction log's row.

by default type = 0

可以下下列的指令試看看

DBCC log (master)
DBCC log (master, type=4)

效果如下:



------------------------------------------------------------------
E. 使用SQL Server 2000 內一個沒被寫在文件的function: fn_dblog
------------------------------------------------------------------

-- entire tlog
select * from ::fn_dblog(NULL, NULL)
-- selection of tlog
select * from ::fn_dblog('129:148:1', '129:150:6')
Note: 129:148:1 is LSN

Select * from ::fn_dblog('', '') where [Begin Time] >= '02/03/08'

------------------------------------------------------------------
F. 使用 3rd party tool, 來觀看 SQL Transaction Log - 以 Lumigent Log Explorer for SQLServer 為例
------------------------------------------------------------------

用上述的 DBCC, fn_dblog 內建指令,很明顯的 雖然可以 Query 出log,但是,那些log
根本就不是人可以看的懂的

但是,MS 官方也沒有這種可以讓人看Transaction Log的工具 (真怪)

所以,只得求助於 3rd party 軟體

將 Lumigent Log Explorer for SQLServer 的 cliet 端、Server端(需與SQL Server裝在一起)裝好後,即可針對 Transaction log做查看分析的動作、還可以把單獨的Transaction挑出來、Rollback 哦 :)

另外,這個軟體,只是幫你 parsing transaction log,所以非transaction類的部分(如, Query的操作) 沒有辦法呈現出來。
若要 Audit 到對 DB 的 insert/update/delete/query ...的話,則要打開 c2 audit mode 或是使用 server side trace or sql profile 來記錄相關的操作

Demo 畫面如下:


閱讀全文...