封震震
摘要:WCF是由微軟公司開發的一系列數據通信的應用程序框架,它是對Web Service的擴展,是獨立與IIS的應用程序,支持HTTP、TCP等多種協議。在線考試系統是一個客戶端與服務器的WCF程序系統,服務器與客戶端通過SOAP協議進行交互,服務器是控制臺應用程序,啟動后會監聽客戶網址,客戶端是一個WPF的窗體程序,啟動后輸入用戶名與密碼,根據用戶權限功能實施操作。
關鍵詞:WCF框架;WPF窗體;SOAP協議
中圖分類號:TP393 文獻標識碼:A 文章編號:1009-3044(2018)28-0056-02
1 系統整體架構
考試系統服務器端采用三層框架+WCF服務模式,創建NetTestModel實體類,構造數據類型,創建NetTestDAL數據訪問層,完成數據庫連接與操作處理,創建NetTestBLL業務邏輯層,編寫業務邏輯函數接口,創建NetTestServer類提供WCF服務,客戶端調用WCF接口函數實現相關功能,系統架構如圖1所示。
2 功能模塊
根據課程在線考核要求,系統采用C/S模式,通過WCF技術架設在線考試服務器,接受客戶端請求進行在線考試。考生登錄系統后,系統隨機生成一套考卷,在規定時間內對考卷進行作答,提交后系統自動評分(若在規定時間內考生未手動提交,系統完成自動提交)。系統主要分為后臺教師和前臺考生兩種用戶權限,教師訪問需要實現的功能有:1)課程管理;2)題庫管理(試題類型、題干及參考答案);3)考生管理;4)考卷生成規則管理;5)考核成績管理。考生訪問需要實現功能有:1)考核課程選擇;2)隨機生成考卷;3)答題與提交功能。
3 WCF服務器程序
建立一個WCF服務,在解決方案資源管理器中生成NetTestService.cs文件和一個INetTestService.cs文件,打開INetTestService.cs文件,我們可以定義一個INetTestService的接口,接口如下:
[ServiceContract]
public interface INetTestService
{ [OperationContract]
string login(UserClass user); // 用戶登錄
[OperationContract]
TestClassaddTest(TestClasstset); //試題增加
[OperationContract]
DataTablegetTestDataTable(); // 獲取試題
[OperationContract]
bool deleteTest(TestClass test); // 刪除試題
[OperationContract]
void updateTest(TestClass test);//更新試題
}
接口有一個[ServiceContract]的屬性,表示該接口是用于公開服務的接口,類似Web Service中的[WebMethod]屬性,接口中帶有[OperationContract]屬性的函數表示公開的服務函數。對應地在NetTestService.cs的類中實現接口函數。
public class NetTestService : INetTestService
{
public string login(UserClass user)
{
UserManager manager = new UserManager();
returnmanager.login(user);
}
… //其他函數略
}
設計控制臺程序,在Program.cs中設計程序如下:
class Program
{
static void Main(string[] args)
{
try
{
stringurl = "http://localhost:8889/NetTestService/";
ServiceHost host = new ServiceHost(typeof(NetTestService), new Uri(url));
host.Open();
Console.WriteLine(url + "正在監聽……");
}
catch (Exception exp)
{
Console.WriteLine(exp.Message);
}
Console.ReadKey();
}
}
“http://localhost:8889/NetTestService/”是服務器地址,8889端口號是自定義的,host是一個ServiceHost對象,這個對象就是服務器啟動用的重要對象,建立它時調用ServeiceHost的構造函數,函數的第一個參數是WCF服務的類名稱,第二個參數是服務器的Uri地址對象。host調用Open方法就使得服務器開始工作了,服務器端就開始監聽客戶端了。
4 客戶端程序
新建一個WPF的窗體項目,執行“添加服務引用”菜單命令,彈出“添加服務應用”對話框,輸入服務器地址http://192.168.18.162:8889/NetTestService/,然后單擊“轉到”按鈕,結果可以看到“服務”中出現了NetTestService服務,在“操作”框中出現接口函數,將其命名空間定義為“TestWCF”。客戶端發現服務器的服務后會自動生成一個代理,在解決方案資源管理器中就可以看到一個名稱為Service References的服務。
客戶端程序的核心就是建立一個客戶端去異步調用接口函數,實現用戶操作功能,以用戶登錄功能為例,簡要代碼結構如下:
public partial class MainWindow : Window
{//建立client對象
TestWCF.NetTestServiceClient client = new TestWCF.NetTestServiceClient();
stringurl = "http://192.168.18.162:8889/NetTestService/";
publicMainWindow()
{
InitializeComponent();
//設置異步調用
client.loginCompleted += client_loginCompleted;
//設置訪問的服務器地址
client.Endpoint.Address = new System.ServiceModel.EndpointAddress(new Uri(url, UriKind.Absolute));
}
voidclient_loginCompleted(object sender, TestWCF.loginCompletedEventArgs e)
{
if (e.Error == null)
{
if (e.Result.Equals("logined"))
{
Get_Info.User = this.txtUser.Text;
Get_Info.Pass = this.txtPass.Password;
Option a = new Option();
a.Show();
this.Close();
}
else if (e.Result.Equals("registered"))
{
MessageBox.Show("注冊成功!請重新登錄");
}
else
{
MessageBox.Show("非法用戶");
}
}
else
MessageBox.Show(e.Error.Message);
}
private void btLogin_Click(object sender, RoutedEventArgs e)
{
stringuName = txtUser.Text.Trim();
stringuPass = txtPass.Password.Trim();
try
{ //異步調用login函數
client.loginAsync(new TestWCF.UserClass { uName = uName, uPass = uPass });
}
catch (Exception exp) { MessageBox.Show(exp.Message); }
}
}
}
程序首先通過TestWCF命名空間的TestWCF.NetTestServiceClient建立一個client對象,然后調用設置login的異步調用返回函數client_loginCompleted,設置client訪問的服務器地址后,在btLogin_Click中直接調用loginAsync函數。運行服務器程序使其處于監聽狀態,運行客戶端程序就可以實現相應功能。
5 結束語
考試系統使用WCF技術,功能代碼在服務器端編碼完成,開發人員只要把功能模塊統一發布為WCF,然后綁定不同的Endpoint進行發布,無需再考慮Model,BLL,DAL等復雜的邏輯轉換,就可以將B/S與C/S結構模式的業務邏輯層真正地融合在一起,從而降低客戶端編碼復雜度,同時提高系統功能更新與維護效率。使用WCF實現SOA,可以對事務、安全、編碼等進行統一管理,協調了各服務器之間的系統操作。
參考文獻:
[1] 馬勇超,金亞萍,張勝,等.基于WCF架構的OPC客戶端技術在物流系統中的應用[J].物流技術與應用,2017,22(3):126-128.
[2] 申華.一種基于WCF技術的遠程數據共享的實現[J].電腦編程技巧與維護,2017(11):67-68,82.
[3] 唐亮,陳向陽,鄭烽.基于WCF技術的分布式任務處理框架的設計[J].電子技術與軟件工程,2017(1):55-56.
[4] 紀洲鵬,趙斐斐.WCF技術在.NET多層架構開發中的應用[J].軟件導刊,2016,15(1):118-120.
【通聯編輯:朱寶貴】