2007年12月17日 星期一

the web site could not be configured... vsenterprisehelper.axd

當使用 Visual Studio 來測試 asp.net 的效能時,有時會出現 "The web site could not be configured correctly; getting ASP.NET process information failed. Requesting 'http://localhost/SimpleTestWebsite/VSEnterpriseHelper.axd' returned an error: The information returned is invalid. " 的訊息。

此狀況出現於 forms authentication。

解法:加入下面的宣告於 web.config

<location path="VSEnterpriseHelper.axd"> <system.web> <authorization> <allow users="?" /> </authorization> </system.web> </location>

2007年12月12日 星期三

網路品質問題

這次,可以說是第一次遇到網路的品質不佳。 但是,只是隔壁電腦而已。 情況是這樣。 Web 伺服器連線到 SQL Server,一直會出現 timeout 的問題。但如果Web 改用我notebook 的xp 開發環境則沒有問題。 直覺就是Web Server 的網路環境有狀況。但要如何證明呢? ping dbServer 都沒問題。但 tracert dbServer 就容易出現timeout。 今天,找到一個更好的指令:pathping dbServer。這個指令會測試每個經過的 router 並進行統計,計算資料遺失的比例。 結果此比例將近 10%。 救命啊!雖然找到問題了,但仍不知道如何解決。 可能是網卡的問題吧!再去買一張網卡來試試看。

2007年12月5日 星期三

Vista 的 Virtual Store

當應用程式不當的將資料寫到 c:\program files\[app]\ 時,Vista 會「貼心」的將這些資料改寫到 C:\Users\[account]\AppData\Local\VirtualStore\Program Files\[app]\ 下,而且該程式跑起來如正常一般。 只是要找到這些檔案會花一些功夫了

2007年11月15日 星期四

識別前 20 個在讀取 I/O 時耗用最多資源的查詢

識別前 20 個在讀取 I/O 時耗用最多資源的查詢
SELECT TOP 20 SUBSTRING(qt.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1), qs.execution_count, qs.total_logical_reads, qs.last_logical_reads,qs.min_logical_reads, qs.max_logical_reads,qs.total_elapsed_time, qs.last_elapsed_time,qs.min_elapsed_time, qs.max_elapsed_time,qs.last_execution_time,qp.query_planFROM sys.dm_exec_query_stats qsCROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qtCROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qpWHERE qt.encrypted=0ORDER BY qs.total_logical_reads DESC
此結果依照成本來排序 產生的結果 xml,可儲存成 .sqlplan,再以 management studio 打開,可檢視其 execution plan. 取自 :http://www.microsoft.com/technet/technetmag/issues/2007/11/SQLQuery/default.aspx?loc=zxhttp://www.microsoft.com/technet/technetmag/issues/2007/11/SQLQuery/default.aspx?pf=true&fig=true&loc=zx

2007年11月13日 星期二

一個新的 Rich Text Editor for asp.net ajax

來源自:http://www.codeplex.com/rte 可於 http://rteditor.members.winisp.net/ 上測試其功能。 哇!超強,而且比 FckEditor 感覺簡單親切許多。

2007年11月2日 星期五

asp.net 1.1 與 2.0 的SSO

公司內有不同的team,以 asp.net 1.1 asp.net 2.0開發程式

一個team只會使用 1.1 來開發,暫時還無法使用 vs2005 來開發程式

一個team 不願再使用 1.1來開發了。真的生產力不好。因此要用  asp.net 2.0 (vs2005) 開發。

 

問題來了,兩個不同版本的程式,當然需要不同的虛擬目錄。都使用 Forms authetication

一般來說會使的使用者需要登入兩次。

 

解法如下:

 

ASP.NET 2.0 的預設decryption AES,而非 asp.net 1.1 3DES。為了讓兩者有一致的解密法,要將一些屬性設定成一致

 

 

ASP.NET 2.0 web.config 而要設定如下。其中,name protection 的值必需與 asp.net 1.1 的一致。

 

<authentication mode="Forms">

      <forms name="VAT" protection="All" loginUrl="login/login.aspx">

      </forms>

    </authentication>

    <authorization>

      <deny users="?" />

    </authorization>

    <machineKey validationKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902" decryptionKey="F9D1A2D3E1D3E2F7B3D9F90FF3965ABDAC304902F8D923AC" validation="SHA1" decryption="3DES" />

 

ASP.NET 1.1 web.config 與上面幾乎要完全相同,不過,不能有 decryption="3DES"的屬性設定。

2007年10月25日 星期四

使用 VSTS 做壓力測試時,設定 storage type 為 SQL

在使用 VSTS 做壓力測試時,需要設定 storage type 為 SQL

指令如下

cd n:\Program Files\Microsoft Visual Studio 8\Common7\IDESQLCMD /S Sql2005dev2 -U sa -P password -i loadtestresultsrepository.sql

2007年10月19日 星期五

不能連線到某些網站

最近我的 Vista 無法連線到某些網站,如 台灣微軟,www.pru.com.tw ,不知道為何麼。 也不能 windows update 好像中毒了。忙掃毒,也沒找到。 爬了幾天文,終於找到是 nVidia 的驅動程式,隨著 Windows update 更新後,就變成這樣了。 解法如下: "裝置管理員"=>"網路介面卡"=>雙按"NVIDIA nForce Networking Controller"=>"驅動程式" 看一下你的驅動是誰提供的..(應該是Nvidia吧) 如果是NVidia的話按"更新驅動程式"=>"瀏覽電腦上的驅動程式軟體"=>按底下那個"讓我從電腦上的裝置...... 挑選"接下來應該會顯示兩個"NVIDIA nForce Networking Controller(Microsoft)NVIDIA nForce Networking Controller(NVidia)"

Restore database 的正確方法

常常需要 restore database 但一旦有人連在線上,就必需先 kill procId 砍也砍不完 正確的 sql script 應如下 alter database DbName Set Single_Userwith rollback immediate use master RESTORE DATABASE [DbName] FROM DISK = N'c:\folder1\db.bak' WITH FILE = 1, NOUNLOAD, REPLACE, STATS = 10, restricted_user alter database DbName Set Multi_User

2007年10月3日 星期三

IIS 7 Modules

在看別人demo 時,總是可以在 IIS 7 上把一堆沒有用到的 modules 移除。 但我在操作時,總是出現 lock violation. 經查詢後,修改 \windows\system32\inetsrv\config\applicationHost.config 將 下所有的 element 之 lockItem 的屬性改成 false 這樣就可以移除不必要的模組了。 預設就要這麼多module,即使不使用。似乎違反 sceure by default rule

安裝 Windows Server 2008 RC0

安裝時,只輸入了 serial number 。 安裝完畢後,要登入時,被要求變更 administrator 的密碼。 就這樣安裝完成了。 微軟在安裝過程,也是極力的簡化。 安裝完畢後,沒有擔任任何的 server role。也就是說,當安裝完畢後,其可以做的事情比 windows vista 還少。 真的是 Secure by defult

遠端桌面,Console mode

一直以為遠桌面連線只能連一個新的連線,無法直接連 Console 發現這是錯的。 mstsc /v servernameOrIp /console 不過,只適用 windows server 2003

2007年10月1日 星期一

Performance Dashboard

1 到這裡下載 http://www.microsoft.com/downloads/details.aspx?familyid=1d3a4a0d-7e0c-4730-8204-e419218c1efc&displaylang=en

2 執行SQLServer2005_PerformanceDashboard.msi

3 於 SSMS 中執行 C:\Program Files\Microsoft SQL Server\90\Tools\PerformanceDashboard\setup.sql 4 檢視報表:在 database 上按右鍵/Custom Reports,選擇 C:\Program Files\Microsoft SQL Server\90\Tools\PerformanceDashboard 下的 performance_dashboard_main.rdl

5 開始連報表上的連結

我最喜歡 missing indexes 這個了。由 sql server的執行計劃中,找到應該需要的 index。而非每次都要用 profiler 錄製並調整,這樣會對 server 有 impact

2007年9月11日 星期二

檢查日期

一直以來,沒注意到日期也能檢查。 不過,只能檢查西元年 步驟如下
  1. 拉一個 CompareValidator
  2. 設定其 ControlToValidate = "txtStart"
  3. 設定其 ErrorMessage
  4. 設定其 Type = Date
  5. 設定其 Operator = DateTypeCheck

之前沒注意到這個功能,一直沒實作日期檢查。真是)(*&^#@!$@$

2007年9月7日 星期五

Stop 0x000000F4

最近,我無聊,在桌上型電腦,也啟用了「休眠」這個東西。 好用。 不過,直到我接上了另一個硬碟,又從「休眠」中醒來後,一切都不一樣了。 休眠前,只有一個硬碟,醒來後,卻多了一顆?XP 就掛了。 還好,重開機後,XP很smart 地,問我應該要重新啟動,而不是再從休眠中醒來。 一切又好像完美了。 但,這樣就沒的寫下來的價值。 後來的一個多禮拜,系統會在2-3個小時,出現恐佈地Blue screen. Stop 0x000000F4 (0x000003, 0x8A1AE868, 08A1AE9DC, 0x805021F8) 每一次,括號中的第二及第三個參數都不同。 好幾次,都想要重作一個xp,但因公事,無法狠下心來。 也移除了一些可能性較大的應用程式,如 Spyware doctory, deamon tool, 等。也檢查過硬碟,記憶體,都無效。 直到我移除了 Google desktop search,生活就回復正常了。 真沒想到是 Google 害我的。 2007/09/11: 後來改用 Windows Desktop Search,就不會有類似的問題了。可是,Windows Desktop Search 還真是慢。

2007年9月1日 星期六

CodeFile 與 CodeBehind

在 VS2005 有兩種網站的專案格式,Web Site 與 Web application project Web Site 的 aspx ,使用的是 @Page CodeFile="xxx.aspx.cs" ,此cs由Server 的 asp.net 來負責compilation成 assmebly 後再執行 Web application project 的 aspx,使用的是 @Page CodeBehind="xxx.aspx.cs",此cs 由VS2005來負責compilation成 assembly,部署到server 後,再交由 asp.net 執行

2007年8月29日 星期三

SecurityAction

SecurityAction 的 enum 值真是怪,不知道是誰取的名 SecurityAction.RequestMinimum:要求assembly至少要有這個權限。如果assmebly 沒有符合這個要求,會產生 Security.Policy.PolicyException。名字應該改成 RequireMinimum 才對。 SecurityAction.RequestOptional:拒絕所有不在SecurityAction.RequestMinimum 及SecurityAction.RequestOptional 的權限。如果不符合,並不會產生 exception。名字應改成 RefuseAllExcept 才對。 SecurityAction.RequestRefuse:正面列出不要的權限。也就是說,如果有這個權限,也拒絕執行。如果不符合,並不會產生 exception。例如我確定不要連sql server,應該在 SqlClientPermission 上設 SecurityAction.RequestRefuse。

2007年8月23日 星期四

Using themed css files requires a header control on the page. (e.g. )

在使用 asp.net 2.0 時,在 web.config 中,使用了theme
<page theme="Blue" ....>

而且此主題中,也使用了 css
一般的網頁正常,但一些網頁就不行了。

如 showImage.aspx 的網頁,使用 Response.OutputStream 來輸出圖片
程式片斷如下
Stream objOutputStream = Response.OutputStream;
if ((strContentType != null) && (strContentType.Trim().Length !=0))
{
Response.ContentType = strContentType;
}
Response.AddHeader("Content-Disposition", "inline;filename=" + strFilename);
objOutputStream.Write(bytes, 0, bytes.Length);

這樣的程式,在VS2003 是正常的。但在 VS2005開發過後,會出現如下的錯誤。

Using themed css files requires a header control on the page. (e.g. <head runat="server" />)

原來,為了讓 themed css 能發揮作用,網頁的 header 必須 runAt="server" 這樣asp.net 才能動態的塞入css 的link
但像純顯示圖片的網頁,就不適用了。

解法方法如下:

1 顯示圖片的網頁,改用 httpHandler ==>大工程
2 顯示圖片的網頁,改用 ashx ==> 也是大工程
3 將ShowImage.aspx 的主題設為空白!!! <%@Page Theme=""> 就可以了。

前兩個方法其實還好,但是網頁名稱由 ShowImage.aspx 改成 ShowImage.hahah 或 showImage.ashx ,都要使用 find and replace 大法。

第三個方法就很吊詭了,Theme一定要設成空白才行,
設成不存在的theme 會出錯Theme 'hahaha' cannot be found in the application or global theme directories.。 EnableTheming="false" 是沒有用的

真是怪

2007年8月21日 星期二

ConfigurationManager and WebConfigurationManager

兩者是相等的。 WebConfigurationManager 只適用於 asp.net,而ConfigurationManager 適用於非asp.net 的應用程式。 兩者不同的地方有三:
  1. WebConfigurationManager 有 GetWebApplictionSection方法,用來取得 web.config 的ConfigurationSection。此法於功能上相同於 ConfigurationManager 的 GetSection 方法。
  2. ConfigurationManger 的 OpenMappedExeConfiguration 方法等同於 WebConfigurationManager 的 OpenMappedWebConfiguration
  3. ConfigurationManger 的 OpenExeConfiguration 方法等同於 WebConfigurationManager 的 OpenWebConfiguration

2007年8月14日 星期二

The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>).

將 VS2003 的asp.net 應用程式migrate 到 VS2005 web application 後,有些原有可以執行的網頁,變的不能執行了 錯誤如下 The Controls collection cannot be modified because the control contains code blocks (i.e. ). Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.Web.HttpException: The Controls collection cannot be modified because the control contains code blocks (i.e. ).Source Error: Line 157: // Line 158: InitializeComponent(); Line 159: base.OnInit(e); Line 160: }Source File: C:\Projects\BankPro\EI\Web\Web.V1.0.7\EInvoiceSolution\EInvoice2\Profile\CompanyEdit.aspx.cs Line: 159 為什麼呢?MS宣傳的太好了,但現實往往是殘酷的。 原來我在網頁中的client javascript ,使用了 <%=%>,如下 function setField() { var strUrl = "InvoiceDisplayFieldSetting.aspx?oid=<%=OID%>"; window.showModalDialog(strUrl,"setField", "dialogWidth:400px;dialogHeight:630px;center:1;scroll:0;help:0;status:0;resizable=0"); } 在 html 中的不會有問題, 但使用了<head runat="server"> 後, client side javacript 就不能使用 解法是override OnInit() 如下 override protected void OnInit(EventArgs e) { InitializeComponent(); base.OnInit(e); Page.DataBind(); } 然後在 client side javacript ,改用 <%# OID%> 大功告成

2007年8月13日 星期一

Dead Locka handling At SQL Server 2005


終於又碰到了Dead locks了。這次,還好是在Sql 2005 上遇到的,比2000來說,簡單許多。
首先,將Sql 2005 profiler的 filters 設好,如附圖。
然後,跑程式。哈哈,就找到了 dead lock 的key lock(通常是table 的 primary key),及造成dead locks 的 process Id ,sql 語法等。使用 Write Evnet Data 將dead lock graph 寫到一個 xml 後再觀看之,可得到更為詳細的資料。
這是我第一次找到 dead lock 及處理完畢。

2007年8月9日 星期四

web deployment projects

可於 http://msdn2.microsoft.com/en-US/asp.net/aa336619.aspx 下載。

其功能,相當於使用 aspnet_compiler.exe 及使用 aspnet_merge.exe ,但是有GUI界面。

可惜,我習慣使用 web application project 的模式開發 asp.net。而web deployment projects只適用 web sites

2007年8月6日 星期一

Cannot create/shadow copy 'xxx' when that file already exists.

使用 VS2005 sp1 開發程式時,常常發生如標題的錯誤。 可是,只要再等個30秒,1分鐘,再執行網頁,就可以了。 真是奇怪。 原來,在 vs2005 sp1 上,增加上 copy on write 的技術,可是在xp 上,好像不太管用。 解法: 在 web.config 上設定一下,就可以了 。 不過呢,使用 VS2005 build asp.net 應用程式時,這樣的設定又會出現 vs2003 常見的問題 Error 749 Unable to copy file "obj\Debug\xxx.dll" to "bin\xxx.dll". The process cannot access the file 'bin\BankPro.WEB.EInvoice.dll' because it is being used by another process. EInvoice2 這就了解了為什麼vs2005 sp1有這的設定了

2007年7月27日 星期五

web.config 加解密

aspnet_regiis -pe "connectionStrings" -app "/WebSite3" -prov "DataProtectionConfigurationProvider" 好方便,這樣就加密了,不用寫程式 另外,-pd 是解密。解密時不用指定 provider aspnet_regiis -pd "connectionStrings" -app "/WebSite3"

2007年7月23日 星期一

MSDTC 設定

每次使用 TransactionScope ,再使用two face commit 時,常常遇到 MSDTC 設定不正確的問題。 今天看到 http://darkthread.blogspot.com/2006/11/kb-net-20-transactionscope.html 這裡的講解,實在太好了。 忍不住記下來 這個也很重要 http://darkthread.blogspot.com/2006/03/msdtc-on-windows-2003-sp1.html

2007年7月20日 星期五

partition by field order by field

存進資料庫時,之前為了弄出序號般的東西,通常會使用 identity 的欄位。 這是直接寫入資料庫的。通常結合 primary key ,於設計時期就規劃好這樣的欄位。 但,有時,常常,需要在UI顯示給使用者的序號,是不用寫入資料庫的。 如 訂單主檔 訂單編號 (primary key) 客戶編號 建立日期 訂單明細檔 訂單編號 產品名稱 數量 序號 (該訂單明細的明細流水號,由1開始) 像這樣的序號欄號,是有規則的,不必寫到資料庫。 以前在UI要呈現這樣的序號,可以使用UI的技巧。有時需要多一點的運算。 現在,SQL Server 2005 提供了這樣的語法層級上的支援 如 select m.BillNo, d.ProductName, d.Qty1, d.UnitQty, d.UnitPrice, NetAmount, row_number() over (partition by d.billNo order by d.billNo) as rowNum from Einvoice.dbo.invoice m inner join Einvoice.dbo.invoiceDetail d on m.BillNo = d.billNo

2007年7月16日 星期一

Sys.argumentOUtOfRangeException Value must be an integer

當我使用AJAX Toolkit 的 calendarExtender 時,發生了一個JScript錯誤 Sys.argumentOUtOfRangeException Value must be an integer Parameter anme:x Actual value was NaN 完全不知道是怎麼回事。 爬了 google,找到了原因。原來我使用了 frameset,其中的 frameborder 的值,"1", "0", "Yes", "No" 都是合法的值。 但 AJAX ToolKit 卻只認得 "1", "0" 改了之後就OK 了

2007年7月12日 星期四

'~/Root/GotoSite.aspx?site=SCIS&winType=2&url=http://www.google.com.tw' is not a valid virtual path.

寫 custom site map provider 時,發生了這樣的問題

'~/Root/GotoSite.aspx?site=SCIS&winType=2&url=http://www.google.com.tw' is not a valid virtual path.

耶?為什麼? 原來,原因指定SiteMapNode的Url 時,指定的值中有 Colon (:) Asterisk (*) 有這兩個字,就會被認為不合法。 微軟有沒有解呢?有的,見http://support.microsoft.com/kb/932552/en-us?spid=8940&sid=global

要裝hotfix哦!真是麻煩

2007年7月11日 星期三

Security Exception

今天跑之前寫好的程式,跑到一半,出現下面的錯誤訊息 Security Exception Description: The application attempted to perform an operation not allowed by the security policy. To grant this application the required permission please contact your system administrator or change the application's 原因出在asp.net 要寫event log 時,無法寫入。因權限的問題。 最後,執行 regedit, 修改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog 的權限,讓aspnet 可以完全控制該 registry 以及其下所有的 registry。 這個 registry path 不好記,寫在blog 備忘一下。 大功告成。不過這樣一來,aspnet 帳號就可能破壞我網頁伺服器的 event log 了,,有沒有比較好的方式呢?

2007年7月10日 星期二

無法解析equal to 動作的定序衝突

今天同事問了一個問題。

Declare @tblCUSTADR table
        (
                [CUST_ID] [char] (6) NOT NULL ,
                [Seq] [char] (1) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL,         
                [Sale_ADR] [nvarchar](60) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL          
        )

insert into @tblCUSTADR(CUST_ID, Seq, Sale_ADR)
                VALUES('A19834', '4', N'台北縣新莊市新泰路號-新杏店')

select t.* from customerAddress address
inner join @tblCUSTADR t on address.SubSeq = t.Seq
inner join Customer on t.CUST_ID = Customer.Cust_ID

結果出現了下面的錯誤訊息。
Msg 446, Level 16, State 9, Line 16
無法解析equal to 動作的定序衝突。

真是受不了,第一次碰到定序的問題。
解法如下:

select * from customerAddress address
inner join @tblCUSTADR t on  address.SubSeq COLLATE Chinese_Taiwan_Stroke_CI_AS = t.Seq COLLATE Chinese_Taiwan_Stroke_CI_AS
inner join Customer on t.CUST_ID = Customer.Cust_ID
COLLATE Chinese_Taiwan_Stroke_CI_AS

2007年7月2日 星期一

Publish a web application in vs2005 sp1

when i publish a web application, some file will change. What kind of rule it obey? I found that : when publishing an web application, all files newer than target file will be copied and overwrite the target files, even the web.config file. So, if web want publish a web application to prodution envirment, ALWAYS remeber to backup all the old files, especially the config files.

2007年6月28日 星期四

Lyrics of “Way Back Into Love” — From “Music and Lyrics”

五月時去了一趟日本,去程時在飛機上看了K歌情人。 日文字幕,看不太懂。可是覺的很好看,回程時又看了一遍。 還是很好看。 於是,又租來看一次。 這大概是我在最短時間內看最多次的電影了。 其中的 way back into love 這首歌非常動聽。 於是將找到的歌詞轉貼在此。參考處 I’ve been living with a shadow overhead I’ve been sleeping with a cloud above my bed I’ve been lonely for so long Trapped in the past, I just can’t seem to move on I’ve been hiding all my hopes and dreams away Just in case I ever need them again someday I’ve been setting aside time To clear a little space in the corners of my mind All I want to do is find a way back into love I can’t make it through without a way back into love Oh oh oh I’ve been watching but the stars refuse to shine I’ve been searching but I just don’t see the signs I know that it’s out there There’s got to be something for my soul somewhere I’ve been looking for someone to shed some light Not just somebody just to get me through the night I could use some direction And I’m open to your suggestions All I want to do is find a way back into love I can’t make it through without a way back into love And if I open my heart again I guess I’m hoping you’ll be there for me in the end There are moments when I don’t know if it’s real Or if anybody feels the way I feel I need inspiration Not just another negotiation All I want to do is find a way back into love I can’t make it through without a way back into love And if I open my heart to you I’m hoping you’ll show me what to do And if you help me to start again You know that I’ll be there for you in the end

2007年6月20日 星期三

Asynchronous Pages in ASP.NET 2.0

Please refer to

http://msdn.microsoft.com/msdnmag/issues/05/10/WickedCode/

ACID rules for transactions

  • Transaction must be Atomic (it is one unit of work and does not dependent on previous and following transactions)
  • Consistent (data is either committed or roll back, no “in-between” case where something has been updated and something hasn’t)
  • Isolated (no transaction sees the intermediate results of the current transaction)
  • Durable (the values persist if the data had been committed even if the system crashes right after).

2007年6月15日 星期五

SQL Server 2005 vs Oracle

        這個網站http://www.tpc.org/ 是資料庫系統的競技場。

        當然,微軟的 SQL Server 2005 並不是champion

        效能來看,前十名,只有一個是微軟的。第一名是 Oracle 10g R2。但是,看它的規格,天哪! 64 CPU。總造價11,987,716 US $,相當於3,9559,4628 NT,近四億新台幣。這是跑車界中鑽石,是全世界最高等級富豪才需要的「身份表徵」。我們平民等級所需要的,是貨真價實的代步用轎車。

 

        如果由價格/效能比來看,前十名有九名是微軟的產品。看看其硬體規格,會發現這才是符合平常百姓家的等級。

有趣的是第一名的Oracle,其價格/效能比,硬是比234 名更便宜上近兩成。我覺得是Oracle 特意打造出來的成果在行銷上有好的交待。

由天瓏書局排行,看國內技術趨勢

     由天瓏書局的中文書暢銷排行http://tlsj.tenlong.com.tw/WebModule/TopSale/topSaleDispAction.do?chi=1 ,可以看到目前最流行的,就是 ASP.NET AJAX , 10本內有三本是講 ASP.NET AJAX

 

其他,ASP.NET 2.0 有一本。

以前10 名來看各個主題的比例,結果如下

 

主題

比例 (%)

ASP.NET AJAX

30

ASP.NET

40

AJAX

40

Microsoft 產品

50

Web

70

 

台灣的開發人員的習性是:看來不得不用的時候,才會去認真學。因此由前十大中文暢銷書,可以看到一些趨勢。

 

因此得到一個結論:

台灣市場目前最流行的是做 AJAX 的網站,而使用微軟技術的佔大宗。而市場上的需求,也是建置Web 網站。

 

2007年6月8日 星期五

Identity in asp.net 2.0

It's realy complicated. Please make sure the difference between the Application_BeginRequest event and duration page excution //operation system thread identity (win32) System.Security.Principal.WindowsIdentity.GetCurrent(); //managed thread identity System.Threading.Thread.CurrentPrincipal.Identity; //asp.net user identity (may be GenericPricipal) HttpContext.Current.User.Identity; // consider the client user windows identity that logon to iis Request.LogonUserIdentity; 再加上多種變化
  1. 使用者有無 windows identity (ex:有無登入domain?)
  2. IIS 上有無勾選 anonymous?有無勾選windows intergration?
  3. application pool 上的 identity 是跑哪一個?(network service? local system? domain user?)
  4. web.config 上設的authentication mode (None, Winows, Forms)
  5. web.config 上有無設 ? 是否有指定 username, password?
這些變化,在Request 進行的過程中(befault autentication, page execution, async thread),上述四種identtity都可能有不同的值。而這些值都是有意義的。 It's really complicated.

enum description

When i make an enum like following public enum SalaryType { ByHour, ByMonth }; I ususaly need to describe the meaning by text. So I need the following code switch( employee.EmployeeType) { case Employee.ByHour: Console.WriteLine("By hour"); break; .... } the code was seperated by definition and client code. I found some code , and it so useful public enum SalaryType { [Description("By hour')]ByHour, [Description("By month")] ByMonth }; public static string GetDescription(Enum value) { FieldInfo fi= value.GetType().GetField(value.ToString()); DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes( typeof(DescriptionAttribute), false); return (attributes.Length>0)?attributes[0].Description:value.ToString(); }

Enterprise Library 3.1

Enterprise Library 3.1 又發佈了。 改版愈來愈快。對於我來說,真是件好事。 也希望 Web Client Software Factory 也能快點改用 EL 3.1 的版本,這樣才一致。

2007年6月5日 星期二

Restore dabase 時,磁碟路徑改變

當將Production 資料庫備份後,想還原到開發的資料庫伺服器時,發現開發與正式機器的磁碟代號不同,結果無法restore

怎麼辦呢?查了一下語法,是可以解決的。
語法如下
RESTORE DATABASE [EInvoice] FROM DISK = N'E:\EInvoice.bak' WITH FILE = 1, NOUNLOAD, STATS = 10
, MOVE 'EInvoice2_Log' TO 'E:\DB\EInvoice_log.ldf'
, MOVE 'EInvoice2_Data' TO 'E:\DB\EInvoice_log.mdf'

2007年6月1日 星期五

Event "EntryDelayCreated" on interface type "TimeSheetNotification.Services.Contracts.IEntryDelayService" for instance id "8f3ff2ac-ef5a-4e0c-a6e9-7f1b6ce33df1" cannot be delivered.

在開發WF ,且使用 SqlPersistenceService 時,一直出現這個錯誤
Event "EntryDelayCreated" on interface type "TimeSheetNotification.Services.Contracts.IEntryDelayService" for instance id "8f3ff2ac-ef5a-4e0c-a6e9-7f1b6ce33df1" cannot be delivered.

而其InnerException 的 message 卻為
Workflow with id "90541a57-f759-4baa-84c5-8e613f59f46d" not found in state persistence store.

怎麼看也看不懂!

使用profiler追蹤了 sql statements 後,發現有一段如下

declare @p10 int
set @p10=0
declare @p11 uniqueidentifier
set @p11=NULL
exec InsertInstanceState @uidInstanceID='8F3FF2AC-EF5A-4E0C-A6E9-7F1B6CE33DF1',@state=0x,@status=3,@unlocked=1,@blocked=0,@info=N'Type
''TimeSheetNotification.Entities.ProjResource'' in Assembly ''TimeSheetNotification.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'' is not marked as
serializable. Type ''TimeSheetNotification.Entities.ProjResource'' in Assembly ''TimeSheetNotification.Entities, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null'' is not marked as serializable.',@ownedUntil=''9999-12-31 23:59:59:997'',@ownerID=default,@nextTimer=''9999-12-31 23:59:59:997'',@result=@p10
output,@currentOwnerID=@p11 output
select @p10, @p11

原來,我在workflow 中,有使用了ProjResource的business entity,但卻未給定 Serializable 的屬性,以致於當workflowruntime 在序列化我的workflow 時失敗了,因此,無法再找回來。

話又說回來,為何當初序列化失敗時,不是直接出現錯誤,而是將錯誤訊息寫到資料庫呢?

務必將Windows 保持到最新狀態

        剛剛看了一篇文章,針對木馬程式做了一些剖析。http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/06/01/816.aspx

 

        結論是,不要以為您沒有開過奇怪的email 附件、沒有下載過好像無害卻是木馬的程式,也沒有執行之。就以為不會中標了。

       

        事實上,只要不了心開了某個網頁,然後攻擊您的作業系統漏洞,就有可能中毒。

        也有可能是正常的網站,被植入了一小段javascript,然後您開啟該網站,就暗地裡被開啟到有問題的網頁。

 

因此,務必將Windows 保持到最新狀態。

同時,也必須更新您的防毒程式病毒特徵碼。最好自行檢查一下。

 

 

 

PS:  不要好奇地去開啟該 blog 中描述的問題網站。一旦開啟,而您的防毒程式沒有動作,您就可能中毒了。當然,沒有防毒程式就更慘了。

 

2007年5月25日 星期五

關閉光碟自動播放

在xp 之後,再也沒有這樣做了。 但是,有時候,卻非常需要。例如,光碟損毀時,一放到光碟機,系統會不斷的嘗試讀取,然後電腦就當機了。 要關閉光碟自動播放,在XP必須使用 gpedit.msc,然後會出現【群組原則】視窗,然後在裡面選擇到【電腦設定】-->【系統管理範本】-->【系統】裡找到-->【關閉自動撥放】 按右鍵選-->內容,選擇【已啟用】, 然後【套用】即可停止光碟自動播放

2007年5月18日 星期五

TransactionScopeOption.Suppress

在使用 System.Transactions.TransactionScope 時,一直發生「The partner transaction manager has disabled its support for remote/network transactions. (Exception from HRESULT: 0x8004D025) 」的錯誤。

實在看不懂,還在MSDTC更改設定。設定老半天,完全不對。

後來,發現只要在scope 中讀取sql2005 的 database 之 table schema,就會發生上述的錯誤。 原來,讀取table schema 是無法交易的。因此,必須將讀取table schema放在TransactionScopeOption.Suppress 中。

程式大意如下:

using (TrsnsactionScope s1 = new TrsnsactionScope())
{
UpdateDBOperation1();
Using (TrsnsactionScope s1 = new TrsnsactionScope(TransactionScopeOption.Suppress))
{
ReadTableScheam(); //不要加入交易
}
UpdateDBOperation2();
}

MSDTC 的設定

早上測試 System.Transactions namespace 時,發生錯誤。
原來,還要設定 MSDTC,才能動。(那要 System.Transactions 幹嘛?)

我的測試環境,是APServer, DBServer。程式當然是寫在APServer。
設定過程如下:

首先,要看看Distribute Transaction Coordinator服務是否啟動。請到services.msc 中檢查。
注意,APServer 與DBServer 都要啟動。

再來,到DBServer
1. 使用元件服務,在左方的樹,找到「我的電腦」後,於其上按右鍵,執行「內容」
2. 選"MSDTC" 頁
3. 點擊"Security Configuration"(安全設定)
4. 確定有勾選"Network DTC Access", "Allow Remote Client","Allow Inbound","No authentication"
5. 按確定後,服務會重啟
6. 不過,之前有經驗,伺服器要重新啟重才有用。

再到 APServer,做與上1-3相同的步驟
4 確定有勾選"Network DTC Access", "Allow Inbound/Outbound","No authentication"
5 必要時,重新開機

Transactions 的種類

之前看過了一堆的 Transaction,總覺的亂亂的。 今早看到一個整理,覺的很好,記了下來。

1 Local transactions in database (eg: SQL server) 2 Local transactions through DB API (eg: ADO.NET) 3 Distributed transactions through Distributed Transaction Coordinator (DTC) 4 Distributed transactions on component level through COM+ (uses DTC) Enterprise Services in the Microsoft .NET Framework 5 Local distributed transactions in ASP.NET and ASMX 6 Microsoft Host Integration Server (HIS) and COM Transactio Integrator for CICS and IMS (COMTI)

2007年5月17日 星期四

http://asp.net/downloads/futures/

今天看了 Asp.net futures 的介紹,心跳不止,約10分鐘。 也不知道是應該高興還是傷心。 高興的是,網頁愈來愈好寫了。傷心的是,又得向美工靠齊一些。 天哪,不用寫程式,也不必拖拉元件,就可以依照資料庫的關聯,長出一堆的頁面了。 (http://server/app/auto.axd) 不過,後來想想,還好n-tier 的架構,還沒被微軟「破解」,變的不用寫程式。 此時我的價值還在。

2007年5月15日 星期二

思考的方式

今天看到了一個故事。
一個教授對他的三個博士班學生說:我們要到高山另一頭的村子買瓶醬油。
第一個學生乖乖地爬了一個月的山,終於把醬油買回來;
第二個學生花了數年研發挖山洞專用的TDM潛盾機,並發表三篇Paper拿到博士學位;
第三個學生則跑到兩條街外的7-11,五分鐘就把醬油買回來了。

你會是哪一個呢?
我想想,我大概會是第二個吧!專案常常會Delay不是沒原因的

教授像是專案經理,製訂策略,卻未必都是對的。
第一個學生是乖乖聽話型,把任務當指令,一成不變的「運算」下去。公司需要這些「機器」人,但也容易替換這些機器人。
第二種是創意研發型。雖然重要,卻容易在專案進行時delay 時程。專案進行時,不要再搞創意了。
第三種是「挑戰」型的思考方式。當接受到任務時,會先想一想有沒有更好、更簡易的方法來完成。

重要的思考的方式。

事件日誌檔已損毀

電腦的板子太舊,造成吃不開新的硬碟。 結果常常發生檔案遺失的問題。 這次,又發生了「事件日誌檔已損毀」 解決方式如下: 1. 先將EventLog的SERVICE設定成停用 2. 重新啟動電腦(這時一定會有錯誤訊息, 不用理他) 3. 將c:\windows\system32\config\sysevent.evt(也就是損毀的系統事件)刪除 4. 再將SERVICE設定成自動 5. 重新啟動電腦 6. 這時會重新建新的事件檔案

2007年5月14日 星期一

Performance tuning 的簡化步驟

1 Requirements a) Performance modeling / requirements 2 Architecture and Design a)Prototype and validate b)Predict bottlenecks c)Desing and review 3 Develop a)Code, review and measure 4 Test a)Simulate load, verify and analyze results

Orcas 中,編寫 javascript 可以intelligense


這樣一來,對於撰寫 ajax 程式,實在方便許多

2007年5月11日 星期五

Custom Channel

在學習 WCF 的過程中,對於產生 Client Proxy 一直有個疑問。
只能以 SVCUtil 或使用VS2005 來產生 proxy file 嗎?

這樣對開發是一個很痛苦的折磨。

在Client side,通常也會使用與 Server side 相同的 business entity。對於同一個開發平台來說,這是非常重要的事情。
但如果使用 svcutil 來產生 proxy class,就會重複的產生 client side 的 business entity。非常不道德。

經過微軟的Patrick 的努力,幫我找到了使用 Custom Channel 的方法。而且,可以直接 reference 與server side 相同的 service contract, business entity。這對於開發來說,至為重要。

其實 code 相當簡單。
// Business entity: Server side, Client side 共用
[DataContract]
public class Customer
{
public Customer(int customId, string name)
{
this.customId = customId;
this.name = name;
}
private string name;

[DataMember]
public string Name
{
get { return name; }
set { name = value; }
}

private int customId;

[DataMember]
public int CustomId
{
get { return customId; }
set { customId = value; }
}
}

//Business Component: Server side
public class CustomBC
{
public Customer GetFirstCustomer()
{
Customer c = new Customer(1, "Charles");
return c;
}
}

//Contract interface: Server side, client side 共用
[ServiceContract]
public interface ICustomerService
{
[OperationContract]
Customer GetFirstCustomer();
}

//Contract Implementation: Server side
[ServiceBehavior(Name = "CustomerService", Namespace = "http://TestCustomChannel.ServiceContracts/2007/05")]
public class MathService : TestCustomChannel.ServiceContracts.ICustomerService
{
public TestCustomChannel.BusinessEntities.Customer GetFirstCustomer()
{
CustomBC bc = new CustomBC();
return bc.GetFirstCustomer();
}
}

//Client Side: 引用Contract interface, business entity

ICustomerService proxy = new ChannelFactory< ICustomerService >("BasicHttpBinding_ICustomerService").CreateChannel();
Customer c = proxy.GetFirstCustomer();

//Client Side config
<client>
<endpoint address="http://localhost:4122/TestCustomChannel.Host/CustomerService.svc"
binding="basicHttpBinding"
contract="TestCustomChannel.ServiceContracts.ICustomerService"
name="BasicHttpBinding_ICustomerService"
/>
</client>

Length of text, ntext, or image data to be replicated exceeds configured maximum 65536

同事在使用 ado.net 將上傳的文件寫到sql server 的 image 欄位時,出現了 Length of text, ntext, or image data to be replicated exceeds configured maximum 65536 的錯誤訊息。 經查證後,原來是 production 機器有設 replication。而replication 的 iamge, text, ntext 欄位預設只能複寫 65536的長度。 真是糟糕。 還好,這可以改變設定 sp_configure 'max text repl size', 2147483647 go RECONFIGURE WITH OVERRIDE go 這樣一來,就又還原到最大值了(2GB)。 不過,既然預設值是如此,代表大太的話,一定有些不方便的地方

2007年5月10日 星期四

檢查誰在呼叫我

assembly發佈出去之後,會被誰呼叫,真的是不知道。

有時,需要確定只能被自己的程式所呼叫。可以利用檢查stackTrace的方法,得知誰在呼叫

 

public void WhoIsCallingMe()

    {

      string allowPublicKeyToken = "12345567890abcdefg";

      System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();

      //取得呼叫者的FullName

      string caller = st.GetFrame(1).GetMethod().ReflectedType.Assembly.FullName;

      System.Text.RegularExpressions.Match m = Regex.Match(caller, "PublicKeyToken=(.{16})");

 

      if ((!m.Success) || (!m.Groups[1].Value.Equals(allowPublicKeyToken)))

        throw new System.Security.SecurityException("未知的caller");

    }

 

InternalsVisibleTo

在VS2003以前,為了開發良好設計的assembly (say A),經常地使用 internal 的 access modifier,讓不該存取的class 看不到。 但是,因為需要,就是需要讓在不同assembly B 的class 看到,那怎麼辦? 以前,只能將assembly B 的程式移到 A 中。可是又違反的商業邏輯。A 與 B 不應該放在一起的。 無解。 在 .net framework 2.0,有了新方法。 在 assembly A 的AssemblyInfo.cs 中,增加下面這一段 using SRC=System.Runtime.CompilerServices; [assembly: SRC.InternalsVisibleTo("AssemblyName, PublicKeyToken=1234567890abcdef")] 而 publicKeyToken 可以使用指令 SN.exe -T assbmelyB.dll 取得

取得public key token 的方法

SN.exe -T assemblyName.dll

2007年5月8日 星期二

IIS 7 無法移除 native type modules

看完 IIS 7 的 demo,演示了可完完全客製模組。 很興奮,就拿了 longhorn beta3 來試。結果,只有 managed type 的 modules 可以移除,而 native type 的不行。 google 了很久,也找不出所以然。最後,找到了 c:\windows\system32\inetsrv\config\applicationHost.config, 修改了下方的 的部份,找到了 ,並將所有的 lockItem="true" 移除。 這樣,才能完全自訂module。 話又說回來,這些 native module ,通常是常用,且增加安全性的模組,預設為locked,這樣的設計好像也沒錯。

2007年5月4日 星期五

Silverlight

最近微軟強打 Silverlight。 這是個用來與 Flash 打對台的技術。而且,當然是 .net 相關的技術。 目前仍在 beta 中. http://go.microsoft.com/fwlink/?LinkID=89144&clcid=0x409 下載回來後,按照其說明,就可以開發了。

2007年4月23日 星期一

Production 與 development 環境建置

在公司內,已經建好了 Project server 2003 的正式環境。但是,卻一直缺乏一個與正式環境類似的開發/測試環境。 今天,狠下心來,結果竟然成功了。 過程其實很簡單。
  1. 建立一個虛擬伺服器 BpProjectServer
  2. 在BpProjectServer 上將全部的東西灌起來 (Single Mathine 配置)
  3. 將production 上的資料庫備份,還原到 BpProjectServer
  4. 將BpProjectServer 上的ProjectServer 資料庫中,MSProjectUser, MSProjectServerUser 刪除
  5. 在BpProjectServer (Server 等級),設定 MSProjectUser 可以使用ProjectServer 資料庫,並設其資料庫角色為 MSProjectRole
  6. 在BpProjectServer (Server 等級),設定 MSProjectServerUser 可以使用ProjectServer 資料庫,並設其資料庫角色為 MSProjectServerRole

然後,就完成了。

注意到,MSProjectServerUser, MSProjectUser的密碼,開發/測試環境必須保持與Production 環境相同。另外,WSS與SMTP也可能需要調整,避免誤會。

2007年4月20日 星期五

Pinging ? with 32 bytes of data

今天一位同事,無法上網。 搞了好久,找不出原因。 有個很怪的訊息。當我 ping serverName 時,正常應如下的資訊 C:\Program Files\Microsoft Visual Studio 8\VC>ping 172.16.1.222 Pinging 172.16.1.222 with 32 bytes of data: Reply from 172.16.1.222: bytes=32 time<1ms TTL=128 Reply from 172.16.1.222: bytes=32 time<1ms TTL=128 Reply from 172.16.1.222: bytes=32 time<1ms TTL=128 Reply from 172.16.1.222: bytes=32 time<1ms TTL=128 但在該台電腦,卻是 Pinging ? with 32 bytes of data: Reply from 172.16.1.222: bytes=32 time<1ms TTL=128 Reply from 172.16.1.222: bytes=32 time<1ms TTL=128 Reply from 172.16.1.222: bytes=32 time<1ms TTL=128 Reply from 172.16.1.222: bytes=32 time<1ms TTL=128 真怪。 經過 Google 大師的教導,知道是 Winsock 的registry 發生問題。需以下列指令重建 netsh winsock reset 重開機後,就正常了。

2007年4月19日 星期四

初始化Reporting Service

在測試環境上,也不道原本Reporting Service是否正常。在改變computer name 後,Reporting Service 就是不能動。 經過一番奮戰後,終於work了。過程如下:
  1. 改變 server name。步驟見上一個 post
  2. 接下來是參考Deleting and Re-creating Encryption Keys。使用SQL Server Surface Area Configuration tool,點選Surface Area Configuration for Features
  3. 點選Reporting Services.
  4. 選 Web Service and HTTP Access,清除 "Enable Web Service and HTTP Access" 的選項
  5. 使用 Reporting Services Configuration tool, 然後連線到正確的 report server instance
  6. 在Encryption Keys 頁, 點 「Change」鍵. Click OK
  7. 使用 SQL Server Configuration Tool,重啟 Reporting server。
  8. 參考步驟 2-4,不過這次要將"Enable Web Service and HTTP Access"設定啟用。
  9. 連線到 http://reportServer/reports ,測試後,是正常的。

複雜啊!

更換Sql Server 2005 的 server name

在安裝完 Sql Server 2005 後,才更換Server name (我的電腦/右鍵後選內容/變更電腦名稱) 但原本在 Sql Server 內已寫入的Server name 已經是舊的電腦名稱了。 該怎麼換呢? --1 檢查伺服器名稱 SELECT @@SERVERNAME --此處查出舊的電腦名稱 --2 EXEC sp_dropserver '填入第一步查出之舊的電腦名稱' --3 EXEC sp_addserver @server='正確的名稱', @local = 'local' --4 重新啟動 SQL Server --5 檢查伺服器名稱 SELECT @@SERVERNAME

2007年4月18日 星期三

由一個datetime 取得日期

下面的T-SQL,只取得日期的部份,而捨棄時間的部份

SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

2007年4月15日 星期日

一台電腦多久不被攻破?

我自己的電腦,不知被攻破多少次了。 即使是現在寫blog的同時,這台電腦也不敢保證是否完全clean的。 看了這個 http://isc.sans.org/survivaltime.html ,描述到如果一個全新的windows xp,未上最新的path,未上fireware, anti-virus的情況下,可以「活」多久? 答案是 5 分鐘

2007年4月13日 星期五

Analysis Service

最近因專案管理系統,需要一個分析/統計的查詢系統,要用到 Analysis Service (Sql Server 2000) 可是,實在不想用 2000了,當然想用 2005。 不過,一切還是學熟一點再說。 畢竟,跟 Sql database engine 實在差很多。不是一兩個禮拜可以學完的。

2007年4月10日 星期二

Enterprise Library 3.0 出來了

Enterprise Library 3.0 出來了 請到 這裡 下載。 此版多了一些有用的 application block, 並且又改進了原有的 2.0 版的效能,但完全與2.0 的相同。也就是說,不用改 code,但是要改設定檔中的版本資訊 2.0 --> 3.0 同時,也可以參考 WebCast

asp.net stateserver 不正常?

同事有人問到,她在開發asp.net (VS.net 2003) 時,不知何時,開始無法使用stateserver 並會出現下面的錯誤 Unable to make the session state request to the session state server. Please ensure that the ASP.NET State service is started and that the client and server ports are the same. If the server is on a remote machine, please ensure that it accepts remote requests by checking the value of HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection. If the server is on the local machine, and if the before mentioned registry value does not exist or is set to 0, then the state server connection string must use either 'localhost' or '127.0.0.1' as the server name. 後來,我幫她執行下列指令,就好了 到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727 下執行 aspnet_regiis.exe -i -enable

2007年4月9日 星期一

Failed to access IIS metabase

當部署 Web application 到 IIS 後,瀏覽網頁時,發生下面的錯誤 System.Web.Hosting.HostingEnvironmentException: Failed to access IIS metabase 此應是「先安裝dotnet framework,後安裝IIS」所發生的問題。 解決方法有二:
  1. 重新安裝 dotnet framework:(1) 移至啟動 [ 控制台 ] [ 新增 / 移除程式 ] 按 (2) 項目名為 Microsoft . NET Framework 2.0 上一下並選取 [ 變更 / 移除 ] 。 備份 Microsoft . NET Framework 2.0 安裝程式 ] 對話方塊隨即開啟。 (3) 選取選項 》 修復 和安裝程式會自動執行所需的修復工作。 會提示您重新啟動系統的處理序完成後您 (4)。
  2. 執行 "C:\WINdows\Microsoft.NET\Framework\v2.0.50727/aspnet_regiis" /i /e

第二個方法比較快

2007年4月2日 星期一

實際完成百比無法累加

在公司使用 Project時,發現有的專案經理所製作的 mpp 檔,在計算大綱任務時,無法自動計算。因此總是會出現 0%。 找了老半天,原因是:有此子任務的實獲值計算方法,是使用「完成百分比」,而非「實際完成百分比 」。 MS Project 在有些是,有些不是的狀況下,也不知道怎麼計算了。直接顯示 0%。 因此,解決的方法是:全選所有任務,執行「任務資訊」,選「進階」頁,將「盈餘分析方法」設為「實際完成百分比」。

2007年3月29日 星期四

網頁中有部份不要Cache

in aspx <% Response.WriteSubstitution(new HttpResponseSubstitutionCallback(CallbackFunction)); %> 或者直接拉一個 Substitution control,並設定其 MethodName 為 CallbackFunction in code behind protected static string CallbackFunction(HttpContext context){ return DateTime.Now.ToString("HH:mm:ss");}

2007年3月28日 星期三

打開 database 的 service broker

alter database Northwind set enable_broker

使用 DEVPATH 找出組件

之前,一直沒有注意到這個小細節。 一旦要開發,就一頭往Vs2005 裡頭鑽。 開發人員可能會想要確定他們正在建置的共用組件是否會與多個應用程式一起正確工作。不需在開發循環一再將組件置於全域組件快取,開發人員可代之以建立 DEVPATH 環境變數來指向組件的組建輸出目錄。 例如,假設您正在建置 (Build) 稱為 MySharedAssembly 的共用組件,而輸出目錄為 C:\MySharedAssembly\Debug。您可以將 C:\MySharedAssembly\Debug 放在 DEVPATH 變數中。您必須接著在電腦組態檔中指定 項目。這個項目會告訴 Common Language Runtime 要使用 DEVPATH 來找出組件。 下列範例顯示如何使 Runtime 在 DEVPATH 環境變數所指定的目錄中搜尋組件。 這個設定值預設為 false。 注意 只可在開發時間使用這個設定值。Runtime 不會檢查在 DEVPATH 中所找到的強式名稱組件版本。它只使用它所找到的第一個版本。

應該要換電腦了

我公司配給我的IBM R50 notebook,真的不行了。 如果只是用來打打字,收收email,上上網,游刃有餘。 但是,我最常做的事,卻是RSS,Visual Studio 2005,測試SQL Server 2005,WCF,WPF,WF, 及眾多的application block,也測試過Vista。 R50、40Gb HDD, 768MB Memory 哪夠? 強迫,一定要換 Desktop PC。不要NoteBook 也行。 NoteBook 自己家裡已經有了。拿來Demo 時,只要能遠端連線即可。

2007年3月27日 星期二

在已經存在的 Web Site, 使用WCSF

請參考 http://blogs.msdn.com/mpuleio/archive/2007/03/25/using-the-wcsf-with-existing-web-site-projects.aspx 。 這對於要「升級」網站的開發方式,有極大的幫助。

2007年3月22日 星期四

FckEditor 也有 asp.net 2.0 的assembly

請參考 http://wiki.fckeditor.net/Developer%27s_Guide/Integration/ASP.Net, 這裡也有web control 可以拖拉到 web form 上哦。 真是方便

http://ajunlee.pbwiki.com/Fckeditor安裝說明

http://ajunlee.pbwiki.com/Fckeditor安裝說明 一直以來,都有線上html 編輯器的需要。 這是一個良好的編輯器。

2007年3月21日 星期三

GridView 中欄位顯示 DataTime 的問題

在GridView 中,要顯示 DataTime時,會出現如 4/21/2005 12:00:00 AM 的格式 設定 DataFormatString 為 {0:d} 也是沒有用。 這時要設定該 Bound Filed 之 HtmlEncode = false; HtmlEncode 預設為 true, 用來對付不安全的 script,可是在 format string 上卻意外造成 issue。 我想這應該是 asp.net 2.0 的design issue。

WCSF 中所使用的Enterprise Library 版本

WCSF 中所使用的Enterprise Library 版本,是使用位在 C:\Program Files\Microsoft Web Client Factory\Microsoft Practices Library 中的 assemblies, 但於January 2006 的版本,卻是 2.0.0.0 的,造成了 version 不相容。 只好全部指向新版的folder。

2007年3月20日 星期二

BPEL for Windows Workflow Foundation March CTP

BPEL for Windows Workflow Foundation March CTP

可於此處下載

http://www.microsoft.com/downloads/details.aspx?familyid=6d0daf00-f689-4e61-88e6-cbe6f668e6a3&displaylang=en

老闆一直要我看 BPEL 相關的東西,終於有進入點了

2007年3月16日 星期五

於asp.net 上存取 msmq 的權限問題

最近寫了一個小程式,用來demo 在實作 soa時, 應該如何設計 web service。 所以需要以 wcf 來存取 msmq 我使用了 local computer 的 private queue 但當 wcf service 存取 msmq 時,卻發生權限的問題。 我在 wcf service 之 web.config 上,加上了具有管理權限的設定 也是不能動。(於 xp sp2 上開發) 解決方法如下:
  1. 使用 Windows 2003 的 application pool: 設該application pool 之identity
  2. xp sp2: 在msmq 之管理 snap-in上,將該 queue 之安全性,設定 computerName\aspnet 為full control (好像太多了)

後來就解決了.

2007年3月15日 星期四

AddressAlreadyInUseException

 

使用WCF ,且使用wsDualHttpBinding , 常常Client app 會發生如下的錯誤

 

System.ServiceModel.AddressAlreadyInUseException: HTTP could not register URL http://+:80/Temporary_Listen_Addresses/c030eb34-4c63-446f-b4d1-0bb7df8c4774/ because TCP port 80 is being used by another application. ---> System.Net.HttpListenerException: 程序無法存取檔案,因為檔案正由另一個程序使用。

 

這是因為 wsDualHttpBinding 預設也是使用 80 port,而此 port 已被 IIS 的預設網站使用了。

 

此時,必須在 client app.conifg 設定 clientBaseAddress 為不同的 port

 

<wsDualHttpBinding>

                <binding clientBaseAddress=http://localhost:9865/myClient/ />

Microsoft Office Word、Excel 及 PowerPoint 2007 檔案格式相容性套件

是否有收到 Office 2007 所產生的文件,如 docx, xlsx, pptx?而使用 office 2003 的您,是否無法打開此類文件。

這時您可以試著安裝相容套件。

Microsoft Office WordExcel PowerPoint 2007 檔案格式相容性套件

將物件序列化到 xml 字串

常看到的範例是將物件序列化到檔案。

但最常需要的卻是序列化到字串。

 

請參考以下範例。注意要 PlaceOrderRequest 必須是Serializable

 

private string GetXmlContent(PlaceOrderRequest request)

    {

      StringWriter writer = new StringWriter();

      XmlSerializer xs = new XmlSerializer(typeof(PlaceOrderRequest));

      xs.Serialize(writer, request);

      return writer.ToString();

    }

LINQ 的方法

今天看了 LINQ 的Demo 原來我之前寫的 ORM tool 早已不實用了。 微軟在 C# 3.0 加入了 LINQ,將 ORM 實作於語言層級,使的ORM 的工具更上一層樓。 然而使用者卻看不出來有 ORM 的外貌。 因此,LINQ 可以達到資料庫查詢,object (in memory) 的查詢,更進一步可達到 資料庫與 memory object 的 inner join 查詢。 硬是要得。

2007年3月13日 星期二

[HowTo]整合Visual Studio 2005與Service Pack 1

參考來源為 [HowTo]整合Visual Studio 2005與Service Pack 1 這傢伙實在是太強了,他的blog 是VS.NET 開發人員應該常看的。

2007年3月12日 星期一

Web Service Software Factory

這個東西很好用。真沒想到微軟愈來愈smart 了。 不過,要按照順序安裝以下的東西。連結到 google 找一下就有了。 Enterprise Library for .NET Framework 2.0 - January 2006 GuidanceAutomationExtensions.msi GuidanceAutomationToolkit.msi Web Service Software Factory - December 2006 (refresh).msi 要試試哦!真是好東西。

Microsoft SQL Server 2005 Service Pack 2 又出來了

Microsoft SQL Server 2005 Service Pack 2 又出來了!!

2005/11/07 2007/03/06短短的14個月,出了SQL Server 2005, sp1, sp2

實在不知道應該罵還是應該讚賞。

有需要者,請到 http://www.microsoft.com/downloads/details.aspx?familyid=D07219B2-1E23-49C8-8F0C-63FA18F26D3A&amp;mg_id=10111&displaylang=en 下載

Visual Studio 2005 Service Pack 1 版本資訊

Visual Studio 2005 Service Pack 1 版本資訊

2007年3月6日 星期二

Service Design Golden Rule

1 10X 設計。當需求為100 concurrent user時,設計一個 1000 concurrent users 的系統。

Enterprise system 中,Client 與 Server 的比例

今天看到的,忍不住寫了下來。

在典型的 Enterprise system中,current client 的比例為 1%,高負載的也才3%

換句話說,當設計一個 current user 100 user 的系統時,其實際的 user 10000 人。

 

微軟 ASP.NET 2.0 AJAX Extensions 1.0 Source Code

微軟在 Ajax 上的努力,已經有正式版出來了。

        而且,竟然公佈了 source code!!

        微軟真的是愈來愈 open mind .

        願意研究的,請自行下載。       

ASP.NET 2.0 AJAX Extensions 1.0 Source Code

 

The request for security token has invalid or malformed elements

在更新 WCF Server Side config 之後,執行 Client Side app 後,在client side app 出現了下列一段的錯誤訊息

 

System.ServiceModel.FaultException: The request for security token has invalid or malformed elements.
   at System.ServiceModel.Security.SecurityUtils.ThrowIfNegotiationFault(Message message, EndpointAddress target)
   at System.ServiceModel.Security.SspiNegotiationTokenProvider.GetNextOutgoingMessageBody(Message incomingMessage, SspiNegotiationTokenProviderState sspiState)

 

覺得莫明其妙。後來才驚覺,在Client Side config 尚未更新。導致Server Side 要求以 A 方式驗證,而Client Side 仍以 B 驗證方式提出Request

 

當然會被當成 malformed element 了。

 

vs2005 update service reference ,更新 config 後即ok

 

安裝 LINQ CTP(May 2006) 後再移除,VS2005 Refactoring 功能不見了

安裝完 Microsoft Visual Studio Code Name "Orcas" - LINQ CTP (May 2006) ,再移除後,發現 VS2005 IDE Refactoring 功能不見了。

這真的很不方便。試了重新設定環境,依然沒效。

 

最後,上了 google ,找到了方法。

 

1. Start up RegEdit.exe

2. Open registry key [HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\Packages\{A066E284-DCAB-11D2-B551-00C04F68D4DB}\SatelliteDLL]

3. Edit the "Path" value and change it from "C:\Program Files\Microsoft Visual Studio 8\VC#\VCSPackages\1033\" to "C:\Program Files\Microsoft Visual Studio 8\VC#\VCSPackages\"

4. Go to C:\Program Files\Microsoft Visual Studio 8\Common7\IDE

5. Run Devenv.exe /Setup

6. Run Devenv.exe /ResetUserData

7. Run Devenv.exe /ResetSettings CSharp

 

Using CasPol to Fully Trust a Share

這是從網路上找來的。來源已記不清楚。

當我想部署VSTO 時,security 一直是很麻煩的事。指令一直記不清楚。

Using CasPol to Fully Trust a Share

Since network shares by default only get LocalIntranet permissions, it's relatively common to want to use CasPol to fully trust some shares that you control and know are safe.  However, CasPol syntax being what it is, the command to do this isn't immediately obvious.  If I wanted to trust everything on the share \\ShawnFa-Srv\Tools, the command:

CasPol.exe -m -ag 1.2 -url file://ShawnFa-Srv/Tools/* FullTrust

Would setup the policy to do what I needed.  Lets break down this command:

·         -m  - modify the machine level of the policy.  This is needed, since the machine level is where all of the default policy lives.  On NT platforms it's also the default level that CasPol works with, however on Win9x, CasPol will default to the user level, so putting -m in the command line explicitly tells CasPol to use the correct level.

·         -ag 1.2  - add a code group under group 1.2.  In the default policy, group 1.2 is the LocalIntranet group, so the new code group that we're creating will only be checked if the file comes from the intranet.

·         -url file://ShawnFa-Srv/Tools/*  - The membership condition for the new code group should be a UrlMembershipCondition, and it should match anything with a URL that starts with file://ShawnFa-Srv/Tools, meaning that any file on the \\ShawnFa-Srv\Tools share will match this code group.

·         FullTrust  - The permission set to grant assemblies that match the code group.  In this case, FullTrust.

Once you know the pattern, it's pretty easy to modify this command line to do slightly different things.  For instance, if I want to trust only a specific non-strongly named assembly on my share, I might use

CasPol -m -ag 1.2 -hash SHA1 -file \\ShawnFa-Srv\Tools\CodeCSS\CodeCSS.exe FullTrust

Which will create a hash membership condition that matches the SHA1 hash of the CodeCSS.exe file.

When I install a new build of the runtime, my install script actually ends with two lines that do just this:

CasPol.exe -pp off -m -ag 1.2 -url file://ShawnFa-Srv/Tools/* FullTrust
copy config\security.config config\security.config.default

Which trusts everything coming off of a share on my computer, and then makes a copy of that policy as the new default, so that all future calls to CasPol -all -reset do not remove this modification.

 

%windir%\Microsoft.NET\Framework\v2.0.50727\caspol -m -ag LocalIntranet_Zone -url "\\SampleSharePointServer\vstodocs\*" FullTrust -n "VSTO Documents"

%windir%\Microsoft.NET\Framework\v2.0.50727\caspol -m -ag LocalIntranet_Zone -url "http://SampleSharePointServer/sitedirectory/*" FullTrust -n "VSTO SharePoint Documents"

 

Virtual PC 2007

        Virtual PC 2007 又來了。

        仍是免費的。微軟出的。自己看簡介

        產品在測試時,特別好用。

 

WCF 的 Asp.Net MemberShipAndRoleProvider sample



一直想試試看 WCF internet 上如何做到 message security 的功能


試了MemberShipAndRoleProvider 這一個 sample


是可以執行的。


但我自己寫了一個來試,卻又一直試不出來。


發生錯誤The X.509 certificate CN=localhost chain building failed. The certificate that was used has a trust chain that cannot be verified. Replace the certificate or change the certificateValidationMode. 撤銷功能無法檢查憑證的撤銷


在比對之下,才發現一個事實。


MemberShipAndRoleProvider sample 下,有個假設,是已執行伺服器端的憑證。但該CA卻不存在。因此,無法達到 Chain trust的功能。


因此,必須將 Client side ChainTrust 改成PeerOrChainTrust。而在Client Side Trusted Person 加入該網站的憑證。


因為該 client side 信任該網站的憑證,且certificateVericationMode 設成 PeerOrChainTrust,就會確認是不是受信任的人。是的話,就成功了。


<behaviors>


<endpointBehaviors>


<behavior name="ClientEndPointBehavior">


<clientCredentials>


<serviceCertificate>


<authentication certificateValidationMode="PeerOrChainTrust" />


</serviceCertificate>


</clientCredentials>


</behavior>


</endpointBehaviors>


</behaviors>


Share with Facebook