购票系统设计
2013-04-10 19:23 Keiven_LY 阅读(533) 评论(0) 编辑 收藏 举报6.1 项目说明
该实例服务宿主为Windows窗体应用程序,客户端也为Windows窗体应用程序。
6.2 项目架构
6.3 项目开发过程
6.3.1 服务端设计
第一步:创建一个空的解决方案,命名为“WCF_TicketWinForm”,(可以任意取名);
第二步:在上述解决方案中,文件——>添加——>新建项目,选择Windows窗体应用程序,取名TicketServerHost,这个Windows窗体应用程序用来作为服务的宿主程序;
第三步:在解决方案中,右键TicketServerHost——>添加——>新建项,选择WCF服务,取名TicketService,系统自动生成ITicketService.cs、TicketService.cs、App.config。其中ITicketService.cs为接口,在此添加契约,相当于web service中的methord;TicketService.cs为契约的实现方法;
ITicketService.cs中的代码:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace TicketServerHost { // 注意: 如果更改此处的接口名称 "ITicketService",也必须更新 App.config 中对 "ITicketService" 的引用。 [ServiceContract] public interface ITicketService { [OperationContract] void DoWork(); /* 系统自动生成的*/ [OperationContract] /* 增加车票的方法*/ void AddTicket(int count); [OperationContract] /*购买车票的方法*/ int BuyTickets(int Num); [OperationContract] /*查询车票的方法*/ int GetRemainingNum(); } // 使用下面示例中说明的数据约定将复合类型添加到服务操作。 [DataContract] //数据契约 public class Ticket { bool boolCount = true; //判断是否还有车票 int howmany = 10; //车票预设张数 [DataMember] /*判断是否还有票*/ public bool BoolCalue { get { return boolCount; } set { if (HowMany > 0) { boolCount = false; } else { boolCount = true; } } } [DataMember] /*返回票数*/ public int HowMany { get { return howmany; } set { howmany = value; } } } }
TicketService.cs中的代码:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace TicketServerHost { // 注意: 如果更改此处的类名 "TicketService",也必须更新 App.config 中对 "TicketService" 的引用。 public class TicketService : ITicketService { public void DoWork() { } //系统自动生成的 Ticket T = new Ticket(); /*实现添加票数的方法*/ public void AddTicket(int count) { T.HowMany = T.HowMany + count; } /*实现返回票数的方法*/ public int GetRemainingNum() { return T.HowMany; } /*实现购买车票的方法*/ public int BuyTickets(int Num) { if (T.BoolCalue) { T.HowMany = T.HowMany - Num; return 1; } else { return 0; } } } }
修改App.config中的地址为:http://localhost:8731/TicketService/
第四步:在窗体中添加两个Button,命名为:“开启服务”,“停止服务”,另外,再添加一个Label
第五步:转到上述窗体代码,右击TicketServerHost项目中的“引用”——>“添加引用”
在代码中引入下述命名空间:
using System.ServiceModel;
第六步:在代码中实例化一个ServiceHost,如下:
ServiceHost host = null;//定义 ServiceHost 这个必须定义
第七步:双击“开启服务”按钮,转到其click事件,代码如下:
private void button1_Click(object sender, EventArgs e) { host = new ServiceHost(typeof(TicketServerHost.TicketService)); host.Open(); this.label1.Text = "服务已启动"; }
第八步:双击“停止服务”按钮,转到其click事件,代码如下:
private void button2_Click(object sender, EventArgs e) { if (host.State != CommunicationState.Closed)//判断服务是否关闭 { host.Close();//关闭服务 } this.label1.Text = "服务已关闭"; }
第九步:运行程序,如图:
点击“开启服务”按钮,如图:
第十步:将App.config中修改的地址http://localhost:8731/TicketService/放在浏览器中查看,若显示如下
点击上面的svcutil.exe链接,若出现下图,说明该服务发布成功
至此,服务器端编写成功!
6.3.2 客户端设计
第一步:在上述解决方案中,文件——>添加——>新建项目,在左侧的项目类型中选择Visual Basic——>Windows在右侧的Visual Studio已安装模板中选择Windows窗体应用程序,取名为TicketServerClient,如图:
第二步:进入后台代码,在TicketServerClient项目中,右键“引用”——>“添加引用”
在代码添加下述命名空间:
using System.ServiceModel;
第三步:找到服务器端的TicketServerHost.exe文件,并双击,
点击“开启服务”按钮,显示如下:
第四步:在TicketServerClient项目中,右键“TicketServerClient”——>添加服务引用,如图
第五步:将App.config中的地址,复制到上图的地址栏中,点击前往,找到该服务,并修改命名空间为TicketService,如图:
点击确“确定”按钮即可。
第六步:设计客户端界面,如图
第七步:编写后台代码如下:
using System; using System.ServiceModel; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace TicketServerClient { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) //购买车票 { using (TicketService.TicketServiceClient proxy_1 = new TicketService.TicketServiceClient()) //创建代理,用于连接服务器 { int i = proxy_1.BuyTickets(Convert.ToInt32(this.txt2.Text)); //调用WCF中的方法 if (i == 1) { this.txt1.Text = "购买成功,"; } this.txt1.Text += "剩余车票还有" + proxy_1.GetRemainingNum().ToString(); } } private void button2_Click(object sender, EventArgs e) //查询票价 { using (TicketService.TicketServiceClient proxy_2 = new TicketService.TicketServiceClient()) //创建代理,用于连接服务器 { this.txt2.Text = ""; this.txt1.Text = ""; this.txt3.Text = proxy_2.GetRemainingNum().ToString();//调用WCF中的方法 } } private void button3_Click(object sender, EventArgs e) { Application.Exit(); } } }
第八步:保存,重新生成解决方案,运行结果如下:
点击“查询车票”按钮,弹框显示:
填写购买车票张数 5 ,点击“购买车票”按钮,弹框显示:
结束!!!