2010年12月23日 星期四

[SQL Server]使用者 'sa' 的登入失敗。

    1. 在資料庫上(image)按右鍵,選擇[附加]資料庫。

                image

    2. 在Server上按右鍵,選擇[屬性]—>[安全性],選擇[SQL Server及Windows驗證模式]

                 imageimageimage

    3. 在[安全性]的[登入]中選擇資料庫使用的帳號,按右鍵選擇[屬性]—>[一般],重新輸入密碼與確認密碼

      imageimage

    4. 承上,在[屬性]—>[狀態],登入項選擇[已啟用]。

               image

    5. 使用SQL Server組態管理員,重新啟動SQL Server與相關物件。

         image

2010年11月28日 星期日

Silverlight控制項預設焦點

  1. using System.Windows.Browser;
  2. 加入事件引發的業務活動
      1:         public MainPage()
      2:         {
      3:             InitializeComponent();
      4:             this.Loaded += new RoutedEventHandler(MainPage_Loaded);
      5:         }
      6: 

  3. 將焦點轉移到Silverlight
      1:         void MainPage_Loaded(object sender, RoutedEventArgs e)
      2:         {            
      3:             HtmlPage.Plugin.Focus();
      4:         }

  4. 將焦點轉移到控制項上
      1:         private void listBox1_Loaded(object sender, RoutedEventArgs e)
      2:         {
      3:             listBox1.IsTabStop = true;
      4:             listBox1.Focus();
      5:         }


    參考資料:



2010年11月10日 星期三

無法從組件A 載入類型B

  • 無法從組件 ‘System.ServiceModel, Version 3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’ 載入類型 ‘System.ServiceModel.Activation.HttpModule’

如果在安裝 .NET Framework 4 後啟用 .NET Framework 3.5 WCF HTTP 啟動,則會發生這個錯誤。 若要解決這個問題,請從 Visual Studio 2010 命令提示字元內部執行下列命令列:

aspnet_regiis.exe -i –enable


參考資料:疑難排解安裝問題



  • 無法載入檔案或組件 'App_Web_a5jyjmqa, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' 或其相依性的其中之一。 系統找不到指定的檔案。


<compilation debug="true" batch="false">



參考資料:未能加載文件或程序集...


                   [DotNet-KB] KB934839 無法載入檔案或組件



  •    Could not load file or assembly 'System.ServiceModel.DomainServices.Hosting'
  •  


image


參考資料:Could not load file or assembly 'System.ServiceModel.DomainServices.Hosting



  •  

2010年11月5日 星期五

書摘 - 《寫給SA的UML/Use Case實務手冊》

 

參與者的特性:

  1. 參與者位於系統外部,它不屬於系統的一部分,所以我們不需要去建造參與者。
  2. 只有會使用系統,會跟系統互動,會跟系統交換資訊者,才會視系統的參與者。
  3. 參與者會啟動、參與使用案例,所以找到參與者,就可以引道我們找到使用案例。
  4. 我們雖然不需要建造參與者,但是卻需要考慮介面。系統需要提供介面讓參與者使用,或者系統需要使用到參與者提供的介面。

尋找參與者的問題表:

  1. 誰會來使用這個系統?
  2. 誰會來安裝這個系統?
  3. 誰會來啟動這個系統?
  4. 誰會來維護這個系統?
  5. 誰會來關閉這個系統?
  6. 那些其他的系統會來使用這個系統?
  7. 誰會從這個系統取得資訊?
  8. 誰會提供資訊給這個系統?
  9. 在預設的時間到時,有時麼事情會自動發生嗎?
  10. 那些其他的系統會與這個系統連線的?
  11. 可有硬體設備會與這個系統連線?
  12. 那些資料庫會與這個系統連線?
  13. 公司內部有哪些人員會來使用這個系統?
  14. 公司外部可有什麼樣的人士會來使用這個系統?
  15. 當特定的時間或事件發生時,這個系統需要自動通知什麼人,或者是自動通知其他系統嗎?

參與者種類表:

種類 細項 參與者
公司內部的人  
公司外部的人  
系統 其他系統(內部)  
其他系統(外部)  
硬體設備    
   

系統簡述:

  • 系統名稱:
  • 系統簡述:<用三兩句話點出系統的主要特色>
  • 重點整理:
    1. <最好可以使用條列式的方式,將討論到的或者想到重要的,一一條列下來,方便日後回顧。>

使用案例的問題表:

  1. 參與者想要從這個系統獲得什麼樣的功能?
  2. 這個系統儲存資訊嗎?那些參與者將建立、讀取、更新或刪除這些資訊?
  3. 當系統內部狀態有變動時,這個系統需要通知參與者嗎?
  4. 是否有什麼外部事件是這個系統需要知道的?當這些外部事件發生時,那些參與者會通知這個系統?
  5. 這個系統需要定期執行什麼工作嗎?
  6. 當發生了某些重要的外部事件時,這個系統需要自動執行什麼工作嗎?
  7. 這個使用案例的名稱夠明確嗎?是不是可以從這個使用案例的名稱,直接判斷出它的產出?
  8. 這個使用案例會有多樣產出結果嗎?還是這些產出結果,其實是在不同的時間點產出的?

使用案例要點表:

使用案例 要點 說明
名稱 產出  
重要步驟  
議題  

使用案例敘述最簡版:

  • 使用案例:<名稱>
  • 事件流程:
    1. <起始點>
    2.  
    3. <終結點>

替代流程的問題表:

  1. 在這個流程步驟上頭,是否還有其他替代的動作?
  2. 在這個流程步驟上頭,是否會發生什麼樣的錯誤?
  3. 在整個使用案例執行過程中,是否隨時可能發生其他未記錄在敘述中的動作?
  4. 參與者輸入資料時,是否會提供不完整的資料,需要重新補上的?
  5. 是否會出現錯誤的資料,需要特別處理的?
  6. 參與者是否會在操作期間,臨時中斷流程?
  7. 參與者是否會在使用案例期間,隨時取消互動?
  8. 參與者是否會想要挑選其他的執行方法?
  9. 參與者在流程執行過程中,會不會有需要協助的地方?
  10. 系統發生當機時,是否需要特殊的處置?
  11. 系統反應時間過長時,是否需要特殊的對應方法?

替代流程分類表:

  • 替代流程:
    • 替代1:不完整的資料
    • 替代2:錯誤的資料
    • 替代3:取消或中斷操作
    • 替代4:其他的執行方法
    • 替代5:需要協助
    • 替代6:系統當機或無回應

包含關係要點表:

  1. 需要共享的相同流程,才能夠獨立出來
  2. 暫存資料或者存取資料庫的動作,不要輕易獨立出來。
  3. 如果只是一兩句相同的流程敘述,不需要大費周章地獨立出來。

擴充關係要點表:

  1. 謹慎地使用擴充關係,避免因為濫用擴充關係,而讓使用案例圖變得很難理解。
  2. 擴充關係通常使用在系統上線之後的改版,可以在不變動已經寫好的使用案例敘述的情況下,利用擴充關係,加上一段新的使用案例敘述,以滿足新的需求。
  3. 不一定會執行的流程,可以放置在替代流程中;要是想要跟其他使用案例共用這段流程的話,也可以改用擴充關係。

切分次系統使用案例的步驟表:

  1. 判斷原先的系統使用案例比較適合分配給哪個次系統,然後幫這個次系統新增一個同名的次系統使用案例。
  2. 再者,原先的系統使用案例敘述中,大部分的流程步驟,都留給這個同名的次系統使用案例。
  3. 然後,將不適合流在新的次系統使用案例中的其餘步驟切分出來,分配給其他次系統,形成其他次系統內部的次系統使用案例。在分派的時候,可以趁機再一次檢視並修訂使用案例敘述,成為新的次系統使用案例敘述。
  4. 接著,更新次系統的使用案例圖,以及重新整理次系統使用案例敘述。
  5. 最後,繪製其他次系統的使用案例圖,以及撰寫這些次系統使用案例敘述。

使用案例圖和使用案例敘述的完整性檢視:

  • 您是否有發現任何新的參與者?以及,是否有哪些參與者是不需要的?
  • 是否有任何參與者不小心被移進系統內了?或者,有任何事物應該位於系統內部,可是卻不小心被移到系統外了?
  • 是否所有參與者的名稱和說明都是有意義,而且閱讀者都能夠容易理解?
  • 您是否有發現任何新的使用案例?是否有遺漏掉任何使用案例呢?
  • 是否所有使用案例的名稱和敘述都是有意義,而且閱讀者都能夠容易理解?
  • 在所有的使用案例敘述中,是否至少描述了一條主要流程?
  • 在所有的使用案例敘述中,是否都有描述替代流程?

決定使用案例的細膩度:

  • 誰需要閱讀並且逼准這份使用案例敘述文件?
  • 誰需要使用這份使用案例敘述文件?
  • 這份使用案例敘述文件用來做什麼的?

 

估計工時=>

使用案例點計算公式:

  1.      未經調整的使用案例點=參與者總權重+使用案例總權重
  2.    技術複雜因子=0.6+(0.01*技術總權重)
  3.      環境因子=1.4+(-0.03*環境總權重)
  4.      使用案例點=未經調整的使用案例點*技術複雜因子*環境因子
  5.   工時=使用案例點*20人時(或28人時)

            參與者加權值:

  1.      簡單型參與者:這類型的參與者通常是其他系統,採用程是介面與我們所開發的系統互動。簡單型參與者的加權值是1。
  2. 一般型參與者:這類型的參與者有兩種:第一種是採用特殊協定互動的其他系統;第二種是採用文字模式互動的人類使用者。普通型參與者的加權值是2。
  3. 複雜型參與者:這類型的參與者就是我們常見的人類使用者,採用豐富且親和力高的圖形介面。複雜型參與者的加權值是3。

       使用案例加權值(依業務量):

  1.      簡單型使用案例:這類型的使用案例擁有少於3個的業務量,它的加權值是5。
  2.  一般型使用案例:這類型的使用案例擁有4~7個的業務量,它的加權值是10。
  3.  複雜型使用案例:這類型的使用案例擁有多於7個的業務量,它的加權值是15。

       使用案例加權值(依物件量):

  1.      簡單型使用案例:這類型的使用案例使用了少於5種的分析物件,它的加權值是5。
  2. 一般型使用案例:這類型的使用案例使用了5~10種的分析物件,它的加權值是10。
  3. 複雜型使用案例:這類型的使用案例使用了多於10種的分析物件,它的加權值是15。

技術因子和加權值

(強烈等級評分:0是最弱的,3是中等強度,5是最強烈的等級。)

因子 說明 加權值 強烈等級 技術權重
T1

分散式系統

2    
T2

反應時間(連線)

1    
T3

終端使用者效能

1    
T4

複雜的內部處理

1    
T5

程式碼可重用程度

1    
T6

容易安裝

0.5    
T7

容易使用

0.5    
T8

便於攜帶

2    
T9

容易更改

1    
T10

同步性

1    
T11

包含特殊的安全機制

1    
T12

提供直接存取給第三方

1    
T13

特殊的使用者培訓設施要求

1    

環境因子和加權值

(強烈等級評分:0是最弱的,3是中等強度,5是最強烈的等級。)

因子 說明 加權值 強烈等級 技術權重
E1

熟悉循環式開發方法

1.5    
E2

應用領域的經驗

0.5    
E3

物件導向的經驗

1    
E4

分析師的能力

0.5    
E5

幹勁

1    
E6

穩定的需求

2    
E7

兼職的工作人力

-1    
E8

困難的程式語言

-1    

負面因子:

E1~E6,強烈等級低於3的個數;E7~E8,強烈等級高於3的個數;兩個數字加總,即為負面因子個數。

  1. ≦2:專案的總負面因子少於或等於2時,可以採用20人時來估算。
  2. 3~4:專案的總負面因子個數等於3或4時,可以採用28人時來估算。
  3. ≧5:專案的總負面因子個數大於或等於5時,專案失敗的可能性非常高,最好可以調整專案,直到專案的負面因子個數降到5以下為止。

2010年11月1日 星期一

Silverlight的原則檔設定

 

1. 使用元件庫的”Silverlight clientaccesspolicy.xml”原則檔

2. 使用一般性的原則檔(clientaccesspolicy.xml)

<?xml version="1.0" encoding="utf-8" ?>
<access-policy>
    <cross-domain-access>
        <policy>
            <allow-from>
                <domain uri="*"/>
            </allow-from>
            <grant-to>
                <socket-resource port="4502-4534" protocol="tcp" />
	       <resource path="/" include-subpaths="true"/>
            </grant-to>
        </policy>
    </cross-domain-access>
</access-policy>

如果檔名錯誤,XML語法錯誤或是找不到檔案,可能會有下面的錯誤。這個錯誤跟程式沒有關係,請特別注意。


訊息: Unhandled Error in Silverlight Application 作業期間發生例外狀況,使得結果無效。如需例外狀況詳細資訊,請檢查 InnerException。   於 System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()


....其他的StackTrace


 


參考資料:


2010年10月17日 星期日

使用WindDBG附加程序除錯Silverlight應用程式

 

使用的程式碼如下:

  1: private void MyButton_Click(object sender, RoutedEventArgs e)
  2: {
  3:     try
  4:     {
  5: 	    throw new Exception("Test exception");
  6:     }
  7:     catch
  8:     {
  9:     }
 10:     Thread.Sleep(25000);
 11:     MyButton.Content = "Pushed";
 12: } 

1. 首先要知道正在執行的應用程式ProcessID,這邊我使用Process Explorer這一套軟體來抓。


image


image 


2. 進入WinDBG,打開[File]->[Attach to a Process…],選取剛剛找到的ProcessID。


image


3. 載入正確的WinDBG Extension DLL – SOS.dll,讓我們可以看到.NET Framework的Managed 程式碼。


(據測試的結果,本步驟可省略,但用!eeversion.chain確認一下較好)


可以用Everything來看一下有哪些SOS.dll


image


看一下目前的執行期環境,我們要挑一個和目前執行期環境相同版本的SOS.dll。


0:022> lm v m *clr*  <== List Loaded Modules(v = verbose;m Pattern )
start    end        module name
63450000 637b9000   coreclr    (deferred)            
    Image path: c:\Program Files\Microsoft Silverlight\4.0.50917.0\coreclr.dll
    Image name: coreclr.dll
    Timestamp:        Fri Sep 17 12:06:19 2010 (4C92E93B)
    CheckSum:         00361079
    ImageSize:        00369000
    File version:     4.0.50917.0
    Product version:  4.0.50917.0
    File flags:       0 (Mask 3F)
    File OS:          4 Unknown Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® Silverlight
    InternalName:     coreclr.dll
    OriginalFilename: coreclr.dll
    ProductVersion:   4.0.50917.0
    FileVersion:      4.0.50917.0 (SL_V4_SVC.050917-0000)
    FileDescription:  Microsoft .NET Runtime Common Language Runtime - WorkStation
    LegalCopyright:   © Microsoft Corporation.  All rights reserved.
    Comments:         Flavor=Retail


也可以使用!eeversion指令。


0:028> !eeversion ==> (顯示 Common Language Runtime 版本)
4.0.50917.0 retail
Workstation mode
SOS Version: 4.0.50917.0 retail build


0:011> .reload ==> (Reload Module)
Reloading current modules
................................................................
............................................................
0:011> .load C:\Program Files\Microsoft Silverlight\4.0.50917.0\sos.dll ==>(Load Extension DLL)


檢查Extension DLL是否已經正確載入


0:011> .chain ==>(List Debugger Extensions)
Extension DLL search Path:
    C:\Program Files\Debugging Tools for Windows (x86)\WINXP;C:\Program Files\Debugging Tools for Windows (x86)\winext;C:\Program Files\Debugging Tools for Windows (x86)\winext\arcade;C:\Program Files\Debugging Tools for Windows (x86)\pri;C:\Program Files\Debugging Tools for Windows (x86);C:\Program Files\Debugging Tools for Windows (x86)\winext\arcade(...省略)
Extension DLL chain:
    C:\Program Files\Microsoft Silverlight\4.0.50917.0\sos: image 4.0.50917.0, API 1.0.0, built Fri Sep 17 12:08:16 2010
        [path: C:\Program Files\Microsoft Silverlight\4.0.50917.0\sos.dll]
    C:\Program Files\Microsoft Silverlight\4.0.50917.0\sos.dll: image 4.0.50917.0, API 1.0.0, built Fri Sep 17 12:08:16 2010
        [path: C:\Program Files\Microsoft Silverlight\4.0.50917.0\sos.dll]
    dbghelp: image 6.12.0002.633, API 6.1.6, built Tue Feb 02 04:08:26 2010
        [path: C:\Program Files\Debugging Tools for Windows (x86)\dbghelp.dll]
    ext: image 6.12.0002.633, API 1.0.0, built Tue Feb 02 04:08:31 2010
        [path: C:\Program Files\Debugging Tools for Windows (x86)\winext\ext.dll]
    exts: image 6.12.0002.633, API 1.0.0, built Tue Feb 02 04:08:24 2010
        [path: C:\Program Files\Debugging Tools for Windows (x86)\WINXP\exts.dll]
    uext: image 6.12.0002.633, API 1.0.0, built Tue Feb 02 04:08:23 2010
        [path: C:\Program Files\Debugging Tools for Windows (x86)\winext\uext.dll]
    ntsdexts: image 6.1.7650.0, API 1.0.0, built Tue Feb 02 04:08:08 2010
        [path: C:\Program Files\Debugging Tools for Windows (x86)\WINXP\ntsdexts.dll]


4. 列出Internet Explorer裡面的執行序,找出應用程式使用的ThreadID和他的內容。


0:011> ~* e !clrstack ==>(~ = 執行序; * = 全部; e = 執行; !clrstack = 提供 Managed 程式碼的堆疊追蹤)
OS Thread Id: 0x7ac (0)
Unable to walk the managed stack. The current thread is likely not a
managed thread. You can run !threads to get a list of managed threads in
the process
(...省略)
OS Thread Id: 0x163c (4)
Child SP IP       Call Site
020ed848 77b164f4 [HelperMethodFrame: 020ed848] System.Threading.Thread.SleepInternal(Int32)
020ed888 62a68e05 System.Threading.Thread.Sleep(Int32)
020ed88c 041e042d
SilverlightApplication1.MainPage.MyButton_Click(System.Object, System.Windows.RoutedEventArgs)
020ed8c4 632a0b81 System.Windows.Controls.Primitives.ButtonBase.OnClick()
020ed8d8 632f9d24 System.Windows.Controls.Button.OnClick()
020ed8e4 632a058e System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(System.Windows.Input.MouseButtonEventArgs)
020ed8f4 63262e01 System.Windows.Controls.Control.OnMouseLeftButtonUp(System.Windows.Controls.Control, System.EventArgs)
020ed904 63260f44 MS.Internal.JoltHelper.FireEvent(IntPtr, IntPtr, Int32, Int32, System.String)
020ed948 632e702f DomainNeutralILStubClass.IL_STUB_ReversePInvoke(Int32, Int32, Int32, Int32, IntPtr)
020eda24 071c6dbc [ContextTransitionFrame: 020eda24]
OS Thread Id: 0xe10 (5)
Unable to walk the managed stack. The current thread is likely not a
managed thread. You can run !threads to get a list of managed threads in
the process
(...省略)


5. 列出Exception的記憶體回收堆積 (Heap) 資訊,取得最近的Method Table物件(這裡是指Exception物件)。


0:011> !dumpheap -type Exception ==>(列出記憶體回收堆積; –type 只會列出相同型別與子型別的物件)
Address       MT     Size
078e1024 62c52b94       80    
078e1074 62c5b580       80    
078e10c4 62c5b5c8       80    
078e1114 62c5b658       80    
078e1164 62c5da48       80    
078e11b4 62c5da48       80    
078e4c24 62c33358       32    
078eb200 633533ac       32    
078eb220 633782a0       32    
078fac6c 6334a330       32    
0791f8b4 62c52b94       80    
total 0 objects
Statistics:
      MT    Count    TotalSize Class Name
633782a0        1           32 MS.Internal.Error+GetExceptionTextDelegate
633533ac        1           32 MS.Internal.Error+ClearExceptionDelegate
6334a330        1           32 System.EventHandler`1[[System.Windows.ApplicationUnhandledExceptionEventArgs, System.Windows]]
62c33358        1           32 System.UnhandledExceptionEventHandler
62c5b658        1           80 System.ExecutionEngineException
62c5b5c8        1           80 System.StackOverflowException
62c5b580        1           80 System.OutOfMemoryException
62c5da48        2          160 System.Threading.ThreadAbortException
62c52b94        2          160 System.Exception
Total 11 objects


6. 列出參考到這個Method Table物件(這裡是指Exception物件)的位址


0:011> !dumpheap -mt 62c52b94 ==> (列出記憶體回收堆積; –mt 列出對應到 MethodTable 結構之物件)       
Address       MT     Size
078e1024 62c52b94       80    
0791f8b4 62c52b94       80    
total 0 objects
Statistics:
      MT    Count    TotalSize Class Name
62c52b94        2          160 System.Exception
Total 2 objects


7. 列出物件內容,這邊是Exception,所以使用!pe指令。


0:011> !pe 0791f8b4 ==>(print exception)
Exception object: 0791f8b4
Exception type:   System.Exception
Message:          Test exception
InnerException:   <none>
StackTrace (generated):
    SP       IP       Function
    020ED88C 041E0417 UNKNOWN!SilverlightApplication1.MainPage.MyButton_Click(System.Object, System.Windows.RoutedEventArgs)+0x57


StackTraceString: <none>
HResult: 80131500
The current thread is unmanaged


結論:


這個例子體現了尋找錯誤必須要由大往小,由粗往細的過程。


由Process到Thread: ProcessID => ~* e !clrstack


由物件到函式表:!dumpheap –type xxx => !dumpheap –mt xxx


參考資料:


2010年10月14日 星期四

讓Visio 2007支援Robustness Diagram(穩健圖、魯棒圖)的三種元素

  1. http://www.softwarestencils.com/uml/index.html#Visio2007下載範本
  2. 設定Vision的檔案路徑
    1. 選擇[工具]=>[選項]=>[進階]=>[檔案路徑] image
    2. 設定[我的圖形(M)][和範本(T)]image
  3. 將下載的檔案放在"C:\Users\<使用者名稱>\我的圖形\軟體與資料庫"下image
  4. 在[檔案]=>[新增]=>[快速入門]中可以見到新增的範本了。

image

2010年10月9日 星期六

Web 測試中的奇怪網址

在Vistual Studio 的Web 測試,錄製時產生了大量的奇怪網址:

https://urs.microsoft.com/urs.asmx?MSURS-Client-Key=...&MSURS-Patented-Lock=...

經過一番網路上的搜尋與自己的測試後,發現原來這個網址是微軟的"Smart Screen篩選"所使用。

在Web 測試中當然要把它關閉,不然除了增加管理與使用的困難,也增加了不必要的網路流量。

怎麼樣關閉Smart Screen篩選功能呢? 有以下三種方法(IE8):

  • (全域)[工具]—>[Smart Screen 篩選] –>[關閉Smart Screen 篩選...]—>選擇 關閉Smart Screen 篩選

image

  • (全域)[工具]—>[網際網路選項]—>[進階]—>關閉 啟用記憶體保護以協助避免網路攻擊

image

  • (區域)[工具]—>[安全性]—>[信任的網站/自訂等級]—>停用 Smart Screen 篩選

(記得要選擇可以信任的網站嘿~~)

image

安全性設定 - 信任的網站區域

參考資料:

ICONIX 開發方法

核心方法很簡單,也符合一般的流程,最重要的是,個人認為可以補足UML開發過程中的不足。

bridgingthechasm-sm

請注意其中的Robustness Diagram。

iconixprocess-lg

較詳細的圖片解說:

iconixprocessroadmap-lg

登入 Robustness Diagram(台:穩健圖、陸:魯棒圖)

登入頁魯棒圖

註冊 Robustness Diagram

註冊魯棒圖

 

參考資料:

深入偵錯程式碼

在程式碼偵錯時,可以顯示.Net Framework的原始程式碼,不但可以了解控制項或其他程序的流程,也可以對錯誤的原因有更進一步的認識,何樂而不為。

1. [啟用.NET Framework 來源步進]時,會取消Just My Code,請讓它取消。Just My Code的意思是偵錯只限定於自己寫的程式碼,現在我們要深入MS所提供的程式碼,所以要取消他。

0001-747x456_thumb1

2. 設定[符號檔(.pdf)位置(F):]與[從符號伺服器將符號快去至此目錄(C):]。本機位置請設定為相同。遠端位置請設定為 http://msdl.microsoft.com/download/symbols

 0003-747x456_thumb1

3. 按[確定]之後,會從遠端下載專案所需要的符號檔。符號檔以命名空間為一個單位,除非專案使用到的命名空間不同,否則這個步驟只會執行一次。

0002-747x456_thumb1

參考資料:

  1. 使用 Microsoft 符號伺服器取得偵錯符號檔
  2. Download Windows Symbol Packages

ASP.NET 狀態管理優缺點比較與建議事項

用戶端狀態管理選項

 

優點

缺點

檢視狀態 不需要伺服器資源
實作簡單
增強安全性功能
效能考量
裝置限制
潛在安全性風險
控制項狀態 不需要伺服器資源
可靠性
全面性
需要部分程式設計工作
隱藏欄位 不需要伺服器資源
廣泛支援
簡單實作
潛在安全性風險
簡單的儲存架構
效能考量
儲存限制
Cookie 可設定的到期規則
不需要伺服器資源
簡化
資料保存性
大小限制
使用者設定的拒絕
潛在安全性風險
查詢字串 不需要伺服器資源
廣泛支援
簡單實作
潛在安全性風險
容量限制

 

用戶端方法狀態管理摘要

狀態管理選項

建議的使用方式

檢視狀態 當您需要儲存網頁將回傳本身的少量資訊時使用。使用 ViewState 屬性會提供基本安全性功能。
控制項狀態 當您需要儲存伺服器來回往返之間控制的少量狀態資訊時使用。
隱藏欄位 您需要儲存網頁將回傳本身或其他網頁的少量資訊,而且不考量安全性的問題時使用。
(注意事項:您只能在送至伺服器的網頁上使用隱藏欄位。)
Cookie 當您需要在用戶端上儲存少量資訊,而且不考量安全性的問題時使用。
查詢字串 當您要將少量資訊從一網頁傳輸至另一網頁,而且不考量安全性的問題時使用。
(注意事項:只有在要求相同網頁,或透過連結要求另一網頁時,才能使用查詢字串。)

 

伺服器端狀態管理選項

  優點 缺點
應用程式狀態 實作簡單
應用程式範圍
應用程式範圍
有限的資料耐久性
資源需求
工作階段狀態 實作簡單
工作階段特定事件
資料保存性
平台延展性
Cookieless 支援
擴充性
效能考量
設定檔屬性 資料保存性
平台延展性
擴充性
效能考量
額外設定的需求
資料維護
資料庫支援 安全性
儲存空間
資料保存性
強固性和資料完整性
協助工具
廣泛支援
複雜度
效能考量

 

伺服器端方法狀態管理摘要

狀態管理選項

建議的使用方式

應用程式狀態 當您正在儲存變更頻率低、由許多使用者使用的全域資訊、而且不考量安全性的問題時使用。
請勿在應用程式狀態中儲存大量資訊。
工作階段狀態 當您要儲存個別工作階段專用且存留期短暫的資訊,同時必須顧慮安全性時使用。
請勿在工作階段狀態中儲存大量資訊。
請注意,工作階段狀態物件會在您應用程式中每個工作階段的存留期期間建立並維護。
在擁有許多使用者的應用程式中,這可能會佔用大量的伺服器資源並且影響延展性。
設定檔屬性 當您儲存在工作階段過期後需要保存的使用者特定資訊,並且在後續造訪應用程式需要再度擷取時使用。
資料庫支援 當您儲存大量資訊、管理交易、或是資料必須不受應用程式和工作階段重新啟動的影響時使用。
資料採擷是重要的,而且也必須顧慮安全性。

 

參考資料: ASP.NET 狀態管理建議事項

伺服器控制項與子屬性的視圖狀態比較

















public class BookNew : WebControl
public class StateManagedAuthor : IStateManager
     
private StateManagedAuthor authorValue;

[DesignerSerializationVisibility(
DesignerSerializationVisibility.Content),
PersistenceMode(PersistenceMode.InnerProperty)]
public virtual StateManagedAuthor Author
{
get
{
if (authorValue == null)
{
authorValue = new StateManagedAuthor();

if (IsTrackingViewState)
{
((IStateManager)authorValue).TrackViewState();
}
}
return authorValue;
}
}
private bool _isTrackingViewState;
private StateBag _viewState;

protected virtual StateBag ViewState
{
get
{
if (_viewState == null)
{
_viewState = new StateBag(false);

if (_isTrackingViewState)
{
((IStateManager)_viewState).TrackViewState();
}
}
return _viewState;
}
}
bool IStateManager.IsTrackingViewState
{
get
{
return _isTrackingViewState;
}
}
internal void SetDirty()
{
_viewState.SetDirty(true);
}
protected override void LoadViewState(object savedState)
{
Pair p = savedState as Pair;
if (p != null)
{
base.LoadViewState(p.First);
((IStateManager)Author).LoadViewState(p.Second);
return;
}
base.LoadViewState(savedState);
}
void IStateManager.LoadViewState(object savedState)
{
if (savedState != null)
{
((IStateManager)ViewState).LoadViewState(savedState);
}
}

protected override object SaveViewState()
{
object baseState = base.SaveViewState();
object thisState = null;

if (authorValue != null)
{
thisState = ((IStateManager)authorValue).SaveViewState();
}

if (thisState != null)
{
return new Pair(baseState, thisState);
}
else
{
return baseState;
}
}
object IStateManager.SaveViewState()
{
object savedState = null;

if (_viewState != null)
{
savedState =((IStateManager)_viewState).SaveViewState();
}
return savedState;
}
protected override void TrackViewState()
{
if (authorValue != null)
{
((IStateManager)authorValue).TrackViewState();
}
base.TrackViewState();
}
void IStateManager.TrackViewState()
{
_isTrackingViewState = true;

if (_viewState != null)
{
((IStateManager)_viewState).TrackViewState();
}
}
public override string ToString()
{
return ToString(CultureInfo.InvariantCulture);
}
public string ToString(CultureInfo culture)
{
return TypeDescriptor.GetConverter(
GetType()).ConvertToString(null, culture, this);
}

參考資料:


資料繫結(數據綁定、DataBind)概略流程

DataBind_thumb3

補充:DataSourceControl 類別

您可以把資料來源控制項想像成 DataSourceControl 物件及其相關資料清單 (稱為資料來源檢視) 的組合。每份資料清單都由 DataSourceView 物件表示。因為基礎資料儲存區包含一個或多個資料清單,所以 DataSourceControl 永遠與一個或多個具名 DataSourceView 物件產生關聯。IDataSource 介面會定義所有資料來源控制項與資料來源檢視互動時使用的方法:GetViewNames 方法是用來列舉目前與資料來源控制項關聯的資料來源檢視,而 GetView 方法則是用來依名稱擷取特定資料來源檢視執行個體。

您也可以把資料來源控制項想像成呼叫端用來存取資料的兩個不同介面。當頁面開發人員在開發 Web Form 網頁時,會直接與 DataSourceControl 類別這個介面互動,而資料繫結控制項和資料繫結控制項作者則會與 DataSourceView 類別這個介面互動。因為只有在執行階段才可使用 DataSourceView 物件,所以資料來源控制項或資料來源檢視的任何保存狀態,都必須由資料來源控制項直接公開。

簡單屬性與複雜屬性

簡單屬性

複雜屬性

1_thumb1[1]
在設計時期屬性介面中只有單一一項可設定的項目
1_thumb1
在設計時其屬性介面中項目的值由子項目決定,項目旁邊有一個小箭頭,表示項目可以展開
2_thumb10
項目屬於控制項的主要元素之一
2_thumb1 項目屬於控制項的子項目,通常以縮排方式顯示
使用ViewState["項目"]來使用ViewState機制 繼承IStateManager來使用ViewState機制
屬於.NET支援的實質型別,不需要TypeConverter 繼承ExpandableObjectConverter來使用TypeConverter機制

 

參考資料:

瀏覽器如何解釋 WebParts 中的 CallBack?

同樣的Server Code,兩家瀏覽器的內容竟然不一樣,來看一下,到底差多少?

Mozilla FireFox

<a 
	onclick="WebForm_DoCallback('ctl00$MainContent$WebPartManager1$VerbWebPart1','RefreshAjax',function(result, controlId){ document.getElementById(controlId).innerHTML = result;},'MainContent_WebPartManager1_VerbWebPart1',null,false);"
	title="Refresh the data2"
	href="javascript:__doPostBack('','')">
	<img title="Refresh the data2" src="/WebResource.axd?d=b0mWHY8S-KhFmq2i0Ng64vjCr7jtn6d1PqDQASYhlciLFSkUesn25v94jo0Hl8v3SSeikIor9zVbWy0TKuelog2&amp;t=634156742020331178"
	alt="Refresh2">
</a>

Internet Explorer

<a title="Refresh the data2"
   href="javascript:void(0)" 
   onclick="document.body.__wpm.Execute(&#39;WebForm_DoCallback(\&#39;ctl00$MainContent$WebPartManager1$VerbWebPart1\&#39;,\&#39;RefreshAjax\&#39;,function(result, controlId){ document.getElementById(controlId).innerHTML = result;},\&#39;MainContent_WebPartManager1_VerbWebPart1\&#39;,null,false);&#39;)" class="menuItem">
   <img src="/WebResource.axd?d=b0mWHY8S-KhFmq2i0Ng64vjCr7jtn6d1PqDQASYhlciLFSkUesn25v94jo0Hl8v3SSeikIor9zVbWy0TKuelog2&amp;t=634156681268366365"
   alt="Refresh the data2"
   width="16"
   height="16"
   style="border-style:none;vertical-align:middle;" />
&nbsp;Refresh2&nbsp;
</a>

在FireFox中,多送了一次PostBack,所以CallBack的結果被洗掉了。


解決方式:在Web Part页面上添加AJAX

WebResource 測試

請參考:建置動作(檔案屬性)

   ASP.NET 2.0 中的 Web Resource

    使用 ASP.NET 2.0 中的 Web 資源

  1: using System;
  2: using System.Collections.Generic;
  3: using System.ComponentModel;
  4: using System.Linq;
  5: using System.Text;
  6: using System.Web;
  7: using System.Web.UI;
  8: using System.Web.UI.WebControls;
  9: using System.Web.UI.WebControls.WebParts;
 10: 
 11: [assembly: WebResource("WebPartLibrary.Images.refresh.gif", "image/gif")]
 12: 
 13: namespace WebPartLibrary
 14: {
 15:     public class VerbWebPart : WebPart
 16:     {
 17:         public override WebPartVerbCollection Verbs
 18:         {
 19:             get
 20:             {
 21:                 string imgUrl = Page.ClientScript.GetWebResourceUrl(this.GetType(), "WebPartLibrary.Images.refresh.gif");
 22: 
 23:                 List<WebPartVerb> menu = new List<WebPartVerb>();
 24:                 WebPartVerb menuItem = new WebPartVerb("Refresh",
 25:                                                         RefreshTest,
 26:                                                         "return confirm('Sure you send?')");
 27:                 menuItem.Text = "Refresh";
 28:                 menuItem.Description = "Refresh the data";
 29:                 menuItem.ImageUrl = imgUrl;
 30:                 menu.Add(menuItem);
 31: 
 32:                 return new WebPartVerbCollection(menu);
 33:                 //return base.Verbs;
 34:             }
 35:         }
 36: 
 37:         void RefreshTest(object sender, WebPartEventArgs e){ 
 38:         }
 39: 
 40:         private string _title = "This is a test part";
 41:         [Personalizable(true)]
 42:         [WebBrowsable(true)]
 43:         [WebDisplayName("Title")]
 44:         public override string Title
 45:         {
 46:             get { return _title; }
 47:             set { _title = value;}
 48:         }
 49: 
 50:         protected override void RenderContents(HtmlTextWriter output)
 51:         {
 52:             output.Write("Hello World!!");
 53:         }
 54:     }
 55: }

 


0001-1440x878_thumb4


產生的Code

<a onclick="return confirm('Sure you send?');"
   title="Refresh the data"
   href="javascript:__doPostBack('ctl00$MainContent$WebPartZone1','partverb:Refresh:VerbWebPart1')">
   <img title="Refresh the data" 
        src="/WebResource.axd?d=b0mWHY8S-KhFmq2i0Ng64vjCr7jtn6d1PqDQASYhlciLFSkUesn25v94jo0Hl8v3SSeikIor9zVbWy0TKuelog2&amp;t=634156163432539640"
		alt="Refresh">
</a>