一.引言 <轉自>http://blog.csdn.net/zhzuo/archive/2004/05/10/22032.aspx
在過去,Web程式員經常在他們的Web程式中使用ActiveX控制項來實現一些胖用戶端才具有的功能。不過現在開發人員可以很容易的通過Microsoft.NET Framework來簡潔和安全的建立對象,並且方便的在IE瀏覽器中切入使用。通過在IE瀏覽器中建立Windows表單控制項,開發人員可以實現豐富的web用戶端。在這篇文章中,我們將會知道怎樣建立Windows表單控制項並且在IE中使用。在瀏覽器中使用表單控制項過程中,我們會示範怎樣通過表單控制項來提供豐富的web用戶端顯示,而表單控制項用來調用遠程Web service擷取資料。與此同時,我們也會知道怎樣利用.NET安全模型來為我們的表單控制項提供一個安全的運行環境。
如果你有過用Java開發Web程式的經驗,那你會很熟悉Java applets。它是一個運行在瀏覽器中的一個小程式。當瀏覽器開啟包含有Applet 標籤的HTML文檔時,Java applets就會運行。Windows表單在web頁裡的工作方式同Java applets很相似。在這個實現中,你建立表單控制項,並為他加上豐富的Windows表單控制項樣式,接著切入到Web頁面中。在瀏覽器載入該Web頁面的時候,Windows控制項所包含的代碼也會被執行。在區域網路或者擴充的網路程式中這個將會是很有用的。比如想開發一個企業使用的具有胖用戶端特性的基與web的程式。
.NET的一個重要特徵就是跟IE緊密結合。比如,我們可以在IE中使用Windows表單控制項,而不需要通知使用者需要加另外的東西。這個不需要註冊什麼.NET CLR就會提供代碼安全訪問的能力。
當你建立Windows表單控制項,你會有表單類層次提供的特徵。比如,你可以使用Windows表單控制項驗證技術來驗證輸入資料的準確性。同樣的,你甚至可以在你的表單控制項中調用Web Service。通過這些技術使用,你可以建立基與.NET平台的豐富的、健壯的、Live App程式。
備忘:按照原文重寫了代碼,把載圖替換成了中文,運行環境:作業系統windows2003,.NET Framework 1.1.這裡講幾點:調試過程中開啟瀏覽器輸入完整地址。如果以檔案方式開啟將不會顯示表單控制項;另外對於進程的調試,可以是單個源檔案。不過我啟動並執行是Debug版本下產生的組件,不是Release的,有興趣讀者可以試試。
二.執行
在這節,我們就會明白怎樣建立Windows表單控制項並在IE中使用。下面列出了五個步驟來完成這一過程。
1.建立Windows表單控制項
2.建立一個帶有object 標籤的HTML文檔,該標籤用來標識Windows控制項
3.配置控制項的虛擬路徑
4.設定代碼存取權限
5.運行控制項
接下來讓我們來看看上面的各個步驟。
1.建立一個windows表單控制項
在這一步中,我們建立一個簡單的Windows表單控制項。控制項實現的功能是顯示”Hello World”給使用者。我們先來建立一個Windows 控制項陳列庫項目取名為HelloWorldControl,修改預設的使用者控制項為HelloWorldCtl。接著在控制項中加入一個Label,取名為lblDisplayMessage,同時增加了一個按鈕btnClick。當使用者點擊按鈕時,將會執行下面的代碼用來顯示訊息給使用者。
private void btnClick_Click(object sender, System.EventArgs e)
{
this.lblDisplayMessage.Text = "Hello World";
}
接著就是編譯他產生一個Assembly。
2.建立HTML頁
在這一步中,我們將建立一個HTML文檔並在裡面插入object標籤。整個文檔看起來如下:
<html>
<body>
<p>Hello World Control
<OBJECT id="HelloWorldControl1" height="300" width="300" classid="http:HelloWorldControl.dll#HelloWorldControl.HelloWorldCtl"
VIEWASTEXT>
</OBJECT>
<br>
</p>
</body>
</html>
在這個標籤的classid 屬性中,我們指定第一步建立的那個組件的路徑以及組件完整限定名。整個完整名稱包括命名空間和整個類名。我們可以在上面的代碼中清楚的看到組件名和限定名用#分割。這兩部分參數組合在一起用來標識控制項的唯一性。當然可以通過取名唯一id為HelloWorldControl1來編寫用戶端指令碼。
3.配置虛擬路徑
有了HTML頁面,現在來建立一個HelloWorldControlHost的虛擬目錄,實際目錄在D:\My Programs\HellpWorldHost,該目錄包含了HelloWorldControl.dll和Hellpworld.htm檔案。當設定虛擬目錄的時候,需要注意的是設定執行許可權為“純指令碼”。如果設定成“指令碼和可執行指令碼”的許可權。那控制項可能不會正常工作(我在IIS6下設定成“指令碼和可執行指令碼”,不正常)。你可以開啟虛擬目錄的屬性來確認設定,設定視窗如下:
4.設定代碼存取權限
如果這個web在區域網路中訪問,他會正常工作。如果該Web是通過Internet來訪問,那你需要設定internet Explorer,修改安全屬性以允許他運行。你可以把首頁加入到受信任的網站。如果需要設定可以通過IE的工具菜單―>Internet選項->安全->受信任的網站,點擊上面的網站按鈕把你的網站加入其中。接下去,當你開啟瀏覽器查看,就會看到正確執行。
5.運行控制項
要運行這個控制項,我們在瀏覽器中查看包含了控制項的那個Html頁面。假如你在頁面上點擊這個按鈕,那麼控制項就會顯示“Hellp World”資訊,執行頁面如下:
在這個例子中,我們實現了怎樣建立件一個Windows表單控制項然後在IE瀏覽器中顯示。在下一節中我們來實現在用戶端瀏覽器上通過表單控制項來訪問Web Service。
三.通過windows表單控制項訪問Web Service
表單控制項一個重要優點就是你可以通過它在用戶端實現豐富的使用者資訊。比如說,你可以通過表單控制項對Web服務的訪問從而在IE中顯示而不需要重新重新整理該頁面。為了示範這點,我們先來建立一個Web服務,接著再來示範怎樣通過表單控制項調用Web服務。
建立Web service
我們建立一個 Visual C# Asp.net web service 新項目,名字取為AuthorsWebService。
建立以後,我們修改服務類名稱為AuthorsService,同時在類裡面增加一個GetAuthors方法到裡面,該方法的代碼如下:
[WebMethod]
public DataSet GetAuthors()
{
string connString = System.Configuration.ConfigurationSettings.AppSettings["connectionString"];
SqlConnection sqlConn = new SqlConnection(connString);
DataSet dstAuthors = new DataSet("Authors");
SqlDataAdapter adapter = new SqlDataAdapter("Select * from Authors",sqlConn);
adapter.Fill(dstAuthors,"Author");
sqlConn.Close();
sqlConn.Dispose();
return dstAuthors;
}
上面方法的代碼比較簡單,我們把資料庫連接字串儲存到了Web.config檔案的appSettings節點上,如下:
<appSettings>
<add key="connectionString" value="server=localhost;uid=sa;pwd=thiru;database=Pubs"></add>
</appSettings>
上面代碼中,
我們建立了一個SqlConnnection執行個體,同時把上面的連接字串作為參數傳入。接著建立一個SqlDataAdapter對象,傳入兩個參數――查詢字串和SqlConnnection執行個體。調用SqlDataAdapter執行個體的Fill方法來執行資料庫查詢並把結果填充到DataSet。現在我們完成了Web服務的建立,接下去來建立一個他的一個用戶端調用。
建立windows表單控制項作為Web服務用戶端
在這裡,我們是想用一個表單控制項來調用Web Service,因此建立一個Visual C#表單控制項項目取名AuthorsWebServiceClientControl:。
完成後,修改預設使用者控制項名稱為AuthorsControl.。我們在上面添加了一個DataGrid控制項取名GridAuthors 同時添加一個按鈕取名BtnClick。註冊按鈕的點擊事件,在事件處理函數中,將會調用WebService。在這之前我們需要添加項目的Web引用,輸入剛才建立的Web服務地址。編輯器會產生該服務的代理,添加Web服務引用如下:
圖
服務代理建立以後,我們在按鈕事件中添加代碼:
private void BtnClick_Click(object sender, System.EventArgs e)
{
this.Cursor = Cursors.WaitCursor;
AuthorsWebServiceProxy.AuthorsService authorsSvc = new
AuthorsWebServiceProxy.AuthorsService();
this.GridAuthors.DataSource = authorsSvc.GetAuthors();
this.Cursor = Cursors.Default;
}
在上面代碼中,我們建立了web服務代理的一個執行個體,並調用GetAuthors方法把返回的資料集賦值給GridAuthors的DataSource屬性。接著編譯這個表單控制項,然後配置虛擬目錄。
建立Html頁面和建立虛擬路徑
在這一步中,我們通過建立一個Html頁面來使用上面建立的那個AuthorsWebServiceClientControl。下面是他的代碼:
<html>
<body>
<p>Authors Display Control<br><br>
<object id="AuthorsControl1"
classid="http:AuthorsWebServiceClientControl.dll#AuthorsWebServiceClientControl.AuthorsControl"
height="500" width="500" VIEWASTEXT>
</object>
<br><br>
</body>
</html>
現在我們需要建立一個虛擬目錄使該控制項能正常工作,並把AuthorsDisplay.htm和AuthorsWebServiceClientControl.dll放在一起。開啟該瀏覽器輸入地址,你就會看到一個按鈕和一個空的DataGrid,如果你點擊該命令按鈕,控制項就會調用Web服務同時把結果寫到了DataGrid中。頁面結果如下所示。
在下一節中我們看看對進程的調試。
四.調試Windows表單控制項
要調試表單控制項,你需要按照下面步驟進行。
1.開啟瀏覽器並請求包含表單控制項的那個Html頁面。
2.開啟visual Studio.Net同時選擇工具->調試進程就會顯示下面的對話方塊。
在這個進程對話方塊中,選擇IEXPLORE.EXE 點擊附加按鈕。當你點擊附加按鈕時會跳出一個對話方塊提示你選擇要調試的程式類型。我們選擇了Common Language Runtime 和Script兩項,如:
確定關閉上面的視窗和進程視窗。
通過Vs.net的檔案菜單開啟使用者控制項檔案 AuthorsWebServiceClient.cs,在原始碼中設定斷點。這樣一旦你設定斷點,你就可以調試該控制項了,如所示。
Windows表單代碼存取權限
就象我們以前討論的一樣。當表單控制項在IE中執行時,他使用由.NET運行時提供的許可權。要弄清楚控制項怎樣使用由.NET運行時提供的代碼訪問安全來在IE中運行,讓我們回到前面,在表單控制項Load事件中加入下面的代碼:
private void AuthorsControl_Load(object sender, System.EventArgs e)
{
if (!EventLog.SourceExists("TestSource"))
EventLog.CreateEventSource("TestSource", "TestLog");
else
{
EventLog.DeleteEventSource("TestSource");
EventLog.CreateEventSource("TestSource", "TestLog");
}
}
在上面的代碼中我們判斷web伺服器上是否存在”TestLog”的日誌源,如果不存在我們就建立他,如果存在就刪除重建。就象你預料的一樣,執行這些代碼需要有更多的許可權,所以上面的代碼通過Internet該使用者控制項將不會正常工作,你將會看到如下的提示視窗。
通過上面視窗我們可以清楚的看到你的訪問被.NET運行時所限制。
在IE中使用表單控制項時,你需要意識到他的優點和局限。主要的優點包括:
1.通過Web實現豐富的動態介面。
2.無縫結合.NET的代碼安全性原則。
3.優於Java applets的表現。
限制包括:
1.用戶端需要是Windows作業系統
2.需要IE6.0的支援
3.用戶端需要安裝.NET運行時環境
4.伺服器端需要是Window2000和IIS5.0或者更高版本
由於上面的限制,對用戶端和伺服器端資料的傳輸這也許也是有利的。比如說由於讓Windows表單控制項在用戶端IE中使用需要用戶端安裝有.NET runtime,我們可以寫一些代碼來判斷客戶機是否安裝有.NET runtime,通過這一特徵我們可以獲得版本號碼,否則會得到0.0。
五.結論
在這篇文章中,我們討論了怎樣在IE中使用瀏覽表單控制項以及在進程中進行調試。同時也講到了在IE中的.NET代碼訪問安全控制。
雖然這項技術的實現需要用戶端安裝.NET運行時,不過我們可以相信在以後的Windows作業系統中將會整合.NET framework,windows2003就是一個很好的例子。
最後,我希望你會發現這篇文章對你有所協助,同時謝謝你的閱讀。
About the Author
Thiru has almost six years of experience in architecting, designing, developing and implementing applications using Object Oriented Application development methodologies. He also possesses a thorough understanding of software life cycle (design, development and testing).
He is an expert with ASP.NET, .NET Framework, Visual C#.NET, Visual Basic.NET, ADO.NET, XML Web Services and .NET Remoting and holds MCAD for .NET, MCSD and MCP certifications.
Thiru has authored numerous books and articles. He can be reached at thiruthangarathinam@yahoo.com.
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/zhzuo/archive/2004/05/10/22032.aspx