基于WCF技术框架的在线考试系统设计

2018-01-04 10:59封震震
电脑知识与技术 2018年28期

封震震

摘要: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.

【通联编辑:朱宝贵】