基于WCF技术框架的在线考试系统设计
2018-01-04封震震
封震震
摘要: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.
【通联编辑:朱宝贵】