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 下載回來後,按照其說明,就可以開發了。

Share with Facebook