封震震
摘要:WCF是由微軟公司開發(fā)的一系列數(shù)據(jù)通信的應(yīng)用程序框架,它是對Web Service的擴(kuò)展,是獨(dú)立與IIS的應(yīng)用程序,支持HTTP、TCP等多種協(xié)議。在線考試系統(tǒng)是一個(gè)客戶端與服務(wù)器的WCF程序系統(tǒng),服務(wù)器與客戶端通過SOAP協(xié)議進(jìn)行交互,服務(wù)器是控制臺應(yīng)用程序,啟動(dòng)后會監(jiān)聽客戶網(wǎng)址,客戶端是一個(gè)WPF的窗體程序,啟動(dòng)后輸入用戶名與密碼,根據(jù)用戶權(quán)限功能實(shí)施操作。
關(guān)鍵詞:WCF框架;WPF窗體;SOAP協(xié)議
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2018)28-0056-02
1 系統(tǒng)整體架構(gòu)
考試系統(tǒng)服務(wù)器端采用三層框架+WCF服務(wù)模式,創(chuàng)建NetTestModel實(shí)體類,構(gòu)造數(shù)據(jù)類型,創(chuàng)建NetTestDAL數(shù)據(jù)訪問層,完成數(shù)據(jù)庫連接與操作處理,創(chuàng)建NetTestBLL業(yè)務(wù)邏輯層,編寫業(yè)務(wù)邏輯函數(shù)接口,創(chuàng)建NetTestServer類提供WCF服務(wù),客戶端調(diào)用WCF接口函數(shù)實(shí)現(xiàn)相關(guān)功能,系統(tǒng)架構(gòu)如圖1所示。
2 功能模塊
根據(jù)課程在線考核要求,系統(tǒng)采用C/S模式,通過WCF技術(shù)架設(shè)在線考試服務(wù)器,接受客戶端請求進(jìn)行在線考試??忌卿浵到y(tǒng)后,系統(tǒng)隨機(jī)生成一套考卷,在規(guī)定時(shí)間內(nèi)對考卷進(jìn)行作答,提交后系統(tǒng)自動(dòng)評分(若在規(guī)定時(shí)間內(nèi)考生未手動(dòng)提交,系統(tǒng)完成自動(dòng)提交)。系統(tǒng)主要分為后臺教師和前臺考生兩種用戶權(quán)限,教師訪問需要實(shí)現(xiàn)的功能有:1)課程管理;2)題庫管理(試題類型、題干及參考答案);3)考生管理;4)考卷生成規(guī)則管理;5)考核成績管理??忌L問需要實(shí)現(xiàn)功能有:1)考核課程選擇;2)隨機(jī)生成考卷;3)答題與提交功能。
3 WCF服務(wù)器程序
建立一個(gè)WCF服務(wù),在解決方案資源管理器中生成NetTestService.cs文件和一個(gè)INetTestService.cs文件,打開INetTestService.cs文件,我們可以定義一個(gè)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);//更新試題
}
接口有一個(gè)[ServiceContract]的屬性,表示該接口是用于公開服務(wù)的接口,類似Web Service中的[WebMethod]屬性,接口中帶有[OperationContract]屬性的函數(shù)表示公開的服務(wù)函數(shù)。對應(yīng)地在NetTestService.cs的類中實(shí)現(xiàn)接口函數(shù)。
public class NetTestService : INetTestService
{
public string login(UserClass user)
{
UserManager manager = new UserManager();
returnmanager.login(user);
}
… //其他函數(shù)略
}
設(shè)計(jì)控制臺程序,在Program.cs中設(shè)計(jì)程序如下:
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 + "正在監(jiān)聽……");
}
catch (Exception exp)
{
Console.WriteLine(exp.Message);
}
Console.ReadKey();
}
}
“http://localhost:8889/NetTestService/”是服務(wù)器地址,8889端口號是自定義的,host是一個(gè)ServiceHost對象,這個(gè)對象就是服務(wù)器啟動(dòng)用的重要對象,建立它時(shí)調(diào)用ServeiceHost的構(gòu)造函數(shù),函數(shù)的第一個(gè)參數(shù)是WCF服務(wù)的類名稱,第二個(gè)參數(shù)是服務(wù)器的Uri地址對象。host調(diào)用Open方法就使得服務(wù)器開始工作了,服務(wù)器端就開始監(jiān)聽客戶端了。
4 客戶端程序
新建一個(gè)WPF的窗體項(xiàng)目,執(zhí)行“添加服務(wù)引用”菜單命令,彈出“添加服務(wù)應(yīng)用”對話框,輸入服務(wù)器地址http://192.168.18.162:8889/NetTestService/,然后單擊“轉(zhuǎn)到”按鈕,結(jié)果可以看到“服務(wù)”中出現(xiàn)了NetTestService服務(wù),在“操作”框中出現(xiàn)接口函數(shù),將其命名空間定義為“TestWCF”??蛻舳税l(fā)現(xiàn)服務(wù)器的服務(wù)后會自動(dòng)生成一個(gè)代理,在解決方案資源管理器中就可以看到一個(gè)名稱為Service References的服務(wù)。
客戶端程序的核心就是建立一個(gè)客戶端去異步調(diào)用接口函數(shù),實(shí)現(xiàn)用戶操作功能,以用戶登錄功能為例,簡要代碼結(jié)構(gòu)如下:
public partial class MainWindow : Window
{//建立client對象
TestWCF.NetTestServiceClient client = new TestWCF.NetTestServiceClient();
stringurl = "http://192.168.18.162:8889/NetTestService/";
publicMainWindow()
{
InitializeComponent();
//設(shè)置異步調(diào)用
client.loginCompleted += client_loginCompleted;
//設(shè)置訪問的服務(wù)器地址
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
{ //異步調(diào)用login函數(shù)
client.loginAsync(new TestWCF.UserClass { uName = uName, uPass = uPass });
}
catch (Exception exp) { MessageBox.Show(exp.Message); }
}
}
}
程序首先通過TestWCF命名空間的TestWCF.NetTestServiceClient建立一個(gè)client對象,然后調(diào)用設(shè)置login的異步調(diào)用返回函數(shù)client_loginCompleted,設(shè)置client訪問的服務(wù)器地址后,在btLogin_Click中直接調(diào)用loginAsync函數(shù)。運(yùn)行服務(wù)器程序使其處于監(jiān)聽狀態(tài),運(yùn)行客戶端程序就可以實(shí)現(xiàn)相應(yīng)功能。
5 結(jié)束語
考試系統(tǒng)使用WCF技術(shù),功能代碼在服務(wù)器端編碼完成,開發(fā)人員只要把功能模塊統(tǒng)一發(fā)布為WCF,然后綁定不同的Endpoint進(jìn)行發(fā)布,無需再考慮Model,BLL,DAL等復(fù)雜的邏輯轉(zhuǎn)換,就可以將B/S與C/S結(jié)構(gòu)模式的業(yè)務(wù)邏輯層真正地融合在一起,從而降低客戶端編碼復(fù)雜度,同時(shí)提高系統(tǒng)功能更新與維護(hù)效率。使用WCF實(shí)現(xiàn)SOA,可以對事務(wù)、安全、編碼等進(jìn)行統(tǒng)一管理,協(xié)調(diào)了各服務(wù)器之間的系統(tǒng)操作。
參考文獻(xiàn):
[1] 馬勇超,金亞萍,張勝,等.基于WCF架構(gòu)的OPC客戶端技術(shù)在物流系統(tǒng)中的應(yīng)用[J].物流技術(shù)與應(yīng)用,2017,22(3):126-128.
[2] 申華.一種基于WCF技術(shù)的遠(yuǎn)程數(shù)據(jù)共享的實(shí)現(xiàn)[J].電腦編程技巧與維護(hù),2017(11):67-68,82.
[3] 唐亮,陳向陽,鄭烽.基于WCF技術(shù)的分布式任務(wù)處理框架的設(shè)計(jì)[J].電子技術(shù)與軟件工程,2017(1):55-56.
[4] 紀(jì)洲鵬,趙斐斐.WCF技術(shù)在.NET多層架構(gòu)開發(fā)中的應(yīng)用[J].軟件導(dǎo)刊,2016,15(1):118-120.
【通聯(lián)編輯:朱寶貴】