簡要地寫出一個.NET Remoting的示例
【考點】
.NET Remoting程式的原理,.NET Remoting的基本編寫方法。
【出現頻率】
★★☆☆☆
【解答】
在VS 2008中新增新的類庫專案,並命名為NetRmClass,將所屬解決方案命名為NetRm,勾選“建立解決方案的目錄”。這樣,NetRmClass類庫專案目錄即屬於NetRm解決方案,並可以繼續向該解決方案新增更多的其他相關專案。類庫專案在這裡僅用於建立一個遠端物件的類,將專案中的cs檔案命名為RmObj,其包含的型別同樣為RmObj,編寫RmObj.cs如程式碼13.4所示。
程式碼13.4 遠端物件類定義 :RmObj.cs
using System;
using System.Windows.Forms;
namespace NetRmClass
{
public class RmObj : MarshalByRefObject
{
//在建構函式中,用提示視窗提示雙方使用者遠端物件建立成功
public RmObj()
{
MessageBox.Show("遠端物件已經建立", "提示資訊");
}
//呼叫Diss方法,會在伺服器端的控制檯程式中輸出方法引數
public void Diss(string msg)
{
Console.WriteLine("客戶端資訊:"+msg);
}
//該方法可返回字串
public string Disc()
{
return "與伺服器端完成通訊";
}
}
}
將NetRm解決方案中的NetRmClass專案進行編譯(VS 2008中選擇選單欄的“專案|生成”命令,快捷鍵為Crtl+F6),即可在該專案目錄中的“bin\Debug”路徑下生成編譯後的NetRmClass.dll程式集。
在VS 2008中的NetRm解決方案再次新增新的控制檯應用程式專案,並命名為NetRmServer。該專案所生成的程式集作為Remoting的伺服器端,首先需要新增“NetRmClass.dll”程式集引用,並匯入NetRmClass名稱空間,編寫該專案的Program.cs如程式碼13.5所示。
程式碼13.5 Remoting伺服器端程式:Program.cs
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using NetRmClass;
namespace NetRmServer
{
class Program
{
//宣告TcpServerChannel型別的靜態欄位channels
static TcpServerChannel channels;
static void Main(string[] args)
{
//建立新的TcpServerChannel物件,埠號為3000,引用為channels
channels = new TcpServerChannel(3000);
//將channels註冊到通道服務
ChannelServices.RegisterChannel(channels, false);
//建立知名服務型別的物件,傳遞遠端物件的型別、物件URI和啟用物件的列舉成員
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RmObj), "MyUri", WellKnownObjectMode.Singleton);
//資訊提示,當使用者輸入字元,則結束程式
Console.WriteLine("======伺服器端已啟動======");
Console.Read();
}
}
}
新增“NetRmClass.dll”程式集引用後,該程式集的副本即被複制到NetRmServer專案目錄中的“bin\Debug”路徑下,以供NetRmServer專案生成的程式集使用。將NetRm解決方案中的NetRmServer專案進行編譯,即可在該專案目錄中的“bin\Debug”路徑下生成編譯後的NetRmServer.exe程式集。
在VS 2008中的NetRm解決方案再次新增新的Windows窗體應用程式專案,並命名為NetRmClient。該專案所生成的程式集作為Remoting的客戶端,首先仍然需要新增“NetRmClass.dll”程式集引用,並匯入NetRmClass名稱空間。在“Form1”窗體的設計檢視中新增一個Button控制元件和TextBox控制元件,分別命名為“button1”和“textBox1”,編寫Form1.cs如程式碼13.6所示。
程式碼13.6 Remoting客戶端程式:Form1.cs
using System;
using System.Windows.Forms;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
using NetRmClass;
namespace NetRmClient
{
public partial class Form1 : Form
{
//宣告TcpClientChannel型別的欄位channelc
TcpClientChannel channelc;
//宣告RmObj型別的欄位obj
RmObj obj;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//建立TcpClientChannel物件,引用為channelc
channelc = new TcpClientChannel();
//將channels註冊到通道服務
ChannelServices.RegisterChannel(channelc, false);
//建立遠端物件
obj = (RmObj)Activator.GetObject(typeof(RmObj), "tcp://localhost:3000/MyUri");
}
private void button1_Click(object sender, EventArgs e)
{
string MyName = textBox1.Text;
//呼叫遠端物件的Diss方法,並傳遞使用者輸入值
obj.Diss(MyName);
//呼叫遠端物件的Disc方法,返回值賦值給textBox1控制元件的“Text”屬性
this.textBox1.Text = obj.Disc();
}
}
};
新增“NetRmClass.dll”程式集引用後,該程式集的副本同樣被複制到NetRmClient專案目錄中的“bin\Debug”路徑下,以供NetRmClient專案生成的程式集使用。將NetRm解決方案中的NetRmClient專案進行編譯,即可在該專案目錄中的“bin\Debug”路徑下生成編譯後的NetRmClient.exe程式集。
至此,一個簡單的.NET Remoting應用解決方案已完成,其中伺服器端為控制檯程式,客戶端為Windows窗體程式。伺服器端所指定的位置是“localhost”,也可以根據程式需要更改為IP地址。
【分析】
本題主要考查面試者對Remoting應用原理的認識,該解答並不適宜於直接應用於實際開發。當伺服器端程式執行後(即執行NetRmServer.exe),使用者在客戶端程式中輸入一些文字,並單擊“button1”按鈕,伺服器端程式和客戶端程式執行效果如圖13.4所示。
圖13.4 .NET Remoting應用示例
解答所編寫的.NET Remoting應用用於在本機上測試,不過已經展示了.NET Remoting技術的基本編寫方法。通過示例,可以清楚理解該技術的強大功能以及靈活性,但是需要程式設計者編寫大量的程式碼,並且需要一致的執行環境支撐。
【考點】
對WCF技術的瞭解,WCF技術的基本內容。
【出現頻率】
★★☆☆☆
【解答】
常用的分散式技術有COM+、.NET遠端技術(Remoting)、Web Service和微軟訊息佇列服務,WCF技術將這些分散式技術整合為一個高效的API。常用的那些分散式技術只能解決專案開發中某個方面的問題,並且不同技術對平臺要求不同。在專案中有時要使用到多種技術從而導致這些技術所提供的服務有重疊之處,並且整個專案的維護複雜性大大增加。WCF技術提供了一個完整統一的方案解決這些問題,它提供了一個用於訪問各種分散式技術的通用API,並且增加了很多必要的服務。
【分析】
本題主要考查面試者對.NET Framework新版本中WCF技術的基本認知。公司招聘.NET程式設計師不一定非要熟練掌握WCF這樣的新技術,但是一定會要求所招聘的人才具備對新技術的瞭解,對新技術探索的好奇心。本題即為這樣的目的而設,難度不大,只要面試者對新技術有一定程度的瞭解,經過短時間的培訓即可掌握,其考查重點在於面試者的知識廣度。
.NET Remoting技術相對於Web Service的優勢和劣勢。
【出現頻率】
★★★☆☆
【解答】
q Remoting技術可以靈活地定義其所基於的協議,比如HTTP協議和TCP協議。在實際開發中,Remoting一般使用TCP協議,這樣可保證在保持狀態的情況下,獲取比Web Service更好的效能,而Web Service預設情況下是沒有狀態的。
q Remoting技術不是行業標準,而Web Service是行業標準,並可能成為下一代網路資料交換的核心組成部分。
q Remoting技術可用.NET的Windows窗體程式或Windows服務進行啟動,也可以使用IIS部署,而Web Service則必須通過IIS之類的服務啟動。
q 在VS 2008等.NET開發環境中,專門對Web Service的呼叫進行了封裝,可以直接通過新增Web引用或服務引用呼叫Web Service,節約大量程式碼。而Remoting需要編寫更多程式碼,開發效率較低。
q .NET Remoting的通訊要求雙方執行相同的平臺框架,如.NET Remoting需要客戶端和伺服器端安裝.NET Framework。而WebService是平臺獨立的,可跨語言(支援XML的語言)互動。
【分析】
本題考查面試者的資料庫相關的ASP.NET開發經驗,.NET Remoting與WebService有所不同,Remoting技術支援HTTP以及TCP通道,而且不僅能傳輸XML格式的SOAP包,也可以傳輸傳統意義上的二進位制流,這使得Remoting效率更高也更加靈活。Remoting不依賴於IIS,伺服器端和客戶端可以非常靈活地部署。從某些方面上來講WebService其實上是.NET Remoting的一種特例。
【出現頻率】 ★★★☆☆
【解答】在VS 2008中新增新的WEB服務程式碼模板到WebSvRm專案,並命名為MyWebSv.asmx。這個程式碼檔案實際已經具備了Web Service的基本程式碼結構,這裡編寫一個能將小寫字母轉換為大寫字母的Web Service應用。首先編寫MyWebSv.asmx.cs如程式碼13.1所示。 程式碼13.1 轉換大寫字母的Web Service:MyWebSv.asmx.cs using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; namespace WebSvRm { //預設名稱空間的指定 [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class MyWebSv : System.Web.Services.WebService { //宣告WebMethod特性,該方法才可以被訪問 [WebMethod] public string ConvertWord(string word) { return word.ToUpperInvariant(); } } } 然後在WebSvRm專案中新增WEB引用,地址為“http://localhost/MyWebSv.asmx”,這時專案目錄下將生成Web References目錄,這個目錄包含有localhost子目錄。然後在WebSvRm專案的預設首頁,即Default.aspx中呼叫Web Service以輸出結果,首先編寫Default.aspx如程式碼13.2所示。 程式碼13.2 呼叫Web Service的頁面:Default.aspx
請輸入需要轉換大寫字母的初始字母或單詞: 呼叫Web Service所返回的結果:
最後編寫Default.aspx.cs如程式碼13.3所示。 程式碼13.3 呼叫Web Service的邏輯程式碼:Default.aspx.cs using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; namespace WebSvRm { public partial class _Default : System.Web.UI.Page { protected void btn_Click(object sender, EventArgs e) { //獲取使用者輸入值 string txt1 = this.input.Text; //建立MyWebSv物件,引用為WebSv1 localhost.MyWebSv WebSv1 = new localhost.MyWebSv(); //呼叫WebSv1方法,並傳遞txt1變數,返回值賦值給txt2 string txt2 = WebSv1.ConvertWord(txt1); //將txt2賦值給output控制元件的“Text”屬性值 this.output.Text = txt2; } } } 開啟IE瀏覽器,在瀏覽器位址列輸入“http://localhost/SendHtml.aspx”,並輸入“microsoft .net framework”到TextBox控制元件中,然後單擊“開始轉換”按鈕,頁面執行效果如圖13.2所示。 圖13.2 Web Service呼叫例項
【分析】本題考查面試者利用VS 2008等開發環境建立Web Service應用的基本方法,因為是基本方法,所以不涉及太多概念。實際上,用該方法建立Web Service應用最為簡便,其中很多工作已經被VS 2008等開發環境封裝,對於很多程式設計者,這些細節部分是透明的。解答中所建立的Web Service方法非常簡單,在呼叫Web Service方法時,直接新增WEB引用即可。開啟新增WEB引用時自動建立的localhost目錄,如圖13.3所示。 圖13.3 新增WEB引用後生成的檔案可見,VS 2008的確做了很多工作,自動建立了4個檔案,其中MyWebSv.disco檔案用於Web Service的靜態發現服務,即使用DISCO定位。不過最常用的Web Service發現服務是使用UDDI發現,即向UDDI伺服器註冊所建立的Web Service,這樣整個Internet上的其他使用者可以呼叫該Web Service的功能了。其中的MyWebSv.wsdl是該Web Service的服務描述,以方便呼叫方瞭解Web Service的功能等資訊。Reference.cs是客戶端的代理類,可用於客戶端程式以所屬平臺的方式直接呼叫Web Service提供的方法等。Reference.map是一個XML檔案,對映了所序列化的檔案,即*.disco檔案和*.wsdl檔案。在實際的專案開發中,Web Service的這些細節工作一般由程式設計者手動編寫,這樣更適用於不同專案的需求。