目的
通过创建WCF客户端、服务器程序,通过实际应用以达到对WCF新知识的进一步掌握。
需求
1 客户端通过服务向服务器端报警,服务器端能接受报警信息,并且向客户端提供接警反馈信息。
2 分别使用直接调用、订阅发布两种模式实现。
3 能传输大数据量100M.
4 要提供寄宿IIs和寄宿应用程序两种服务发布方式。
需求分析
通过对上述需求的分析,整个系统的结构初步可以划分为:
1. AlarmContracts :用于系统用到的各种服务、服务所需数据类型的的约定部分。(类库对象)
扫描二维码关注公众号,回复:
8812779 查看本文章
2. AlarmServices:服务类的具体实现部分。(类库对象)
3. AlarmWinService:提供服务类寄宿Windows应用程序的实现,以及对服务实例的管理等。(Windows应用程序)
4. AlarmWinClient:寄宿于Windows应用程序的WCF服务客户端调用。(Windows应用程序)
5. AlarmWebService:提供WCF服务类寄宿于IIS的实现,以及对服务实例的管理。(web服务对象)
6.AlarmWebClient: 寄宿于IIS的WCF服务客户端调用。 (windows应用程序)
这种结构最主要的一个目的是达到服务端和客户端之间的松耦合。
系统解决方案结构
服务契约的创建
[ServiceContract(CallbackContract=typeof(ICallbackEvents))]
public interface IAlarmService
{
/// <summary>
///简单参数
/// </summary>
/// <param name="name">报警员姓名</param>
/// <returns>接警员姓名</returns>
[OperationContract]
string Alarm1(string name);
public interface IAlarmService
{
/// <summary>
///简单参数
/// </summary>
/// <param name="name">报警员姓名</param>
/// <returns>接警员姓名</returns>
[OperationContract]
string Alarm1(string name);
/// <summary>
/// 复杂参数
/// </summary>
/// <param name="callAlarmInfo">报警的相关信息</param>
/// <returns>接警相关信息</returns>
[OperationContract]
FeedBackInfo Alarm2(AlarmInfo alarmInfo);
/// 复杂参数
/// </summary>
/// <param name="callAlarmInfo">报警的相关信息</param>
/// <returns>接警相关信息</returns>
[OperationContract]
FeedBackInfo Alarm2(AlarmInfo alarmInfo);
/// <summary>
/// 递归复杂参数
/// </summary>
/// <param name="alarmInfo"></param>
/// <returns></returns>
[OperationContract(IsOneWay=true)]
void Alarm3(Spectator spectator);
/// <summary>
/// 大数据量参数
/// </summary>
/// <param name="extentName">二进制文件</param>
/// <param name="extentName">附件扩展名</param>
[OperationContract]
void AlarmAffix(byte[] file,string extentName);
/// 大数据量参数
/// </summary>
/// <param name="extentName">二进制文件</param>
/// <param name="extentName">附件扩展名</param>
[OperationContract]
void AlarmAffix(byte[] file,string extentName);
/// <summary>
/// 客户端向服务端订阅服务
/// </summary>
/// <param name="id"></param>
[OperationContract(IsOneWay = true)]
void Subscribe(Guid id);
/// <summary>
///
/// </summary>
/// <param name="id"></param>
[OperationContract(IsOneWay = true)]
void UnSubscribe(Guid id);
}
///
/// </summary>
/// <param name="id"></param>
[OperationContract(IsOneWay = true)]
void UnSubscribe(Guid id);
}
服务对象的实现
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextMode = InstanceContextMode.Single)]
public class AlarmService : Contracts.IAlarmService
{
/// <summary>
/// 在服务端已经注册服务的客户端列表
/// </summary>
public List<Guid> list_SubscrberId = null;
public List<ICallbackEvents> list_Callback = null;
public AlarmInfo alarmInfo = null;
public Spectator spectator = null;
public string currentInfo;
public class AlarmService : Contracts.IAlarmService
{
/// <summary>
/// 在服务端已经注册服务的客户端列表
/// </summary>
public List<Guid> list_SubscrberId = null;
public List<ICallbackEvents> list_Callback = null;
public AlarmInfo alarmInfo = null;
public Spectator spectator = null;
public string currentInfo;
public AlarmService()
{
list_Callback = new List<ICallbackEvents>();
list_SubscrberId = new List<Guid>();
}
{
list_Callback = new List<ICallbackEvents>();
list_SubscrberId = new List<Guid>();
}
/// <summary>
///简单参数
/// </summary>
/// <param name="name">报警员姓名</param>
/// <returns>接警员姓名</returns>
public string Alarm1(string name)
{
this.currentInfo = "";
this.currentInfo = name;
return name;
}
///简单参数
/// </summary>
/// <param name="name">报警员姓名</param>
/// <returns>接警员姓名</returns>
public string Alarm1(string name)
{
this.currentInfo = "";
this.currentInfo = name;
return name;
}
/// <summary>
/// 复杂参数
/// </summary>
/// <param name="callAlarmInfo">报警的相关信息</param>
/// <returns>接警相关信息</returns>
public Contracts.FeedBackInfo Alarm2(Contracts.AlarmInfo alarmInfo)
{
alarmInfo = alarmInfo;
Contracts.FeedBackInfo feedBackInfo = new Contracts.FeedBackInfo();
feedBackInfo.AcceptAlarmPerson = "毛泽东";
feedBackInfo.AcceptAlarmTime = DateTime.Now;
feedBackInfo.AccidentType = 2;
feedBackInfo.AlarmLevel = 3;
feedBackInfo.ID = "3";
/// 复杂参数
/// </summary>
/// <param name="callAlarmInfo">报警的相关信息</param>
/// <returns>接警相关信息</returns>
public Contracts.FeedBackInfo Alarm2(Contracts.AlarmInfo alarmInfo)
{
alarmInfo = alarmInfo;
Contracts.FeedBackInfo feedBackInfo = new Contracts.FeedBackInfo();
feedBackInfo.AcceptAlarmPerson = "毛泽东";
feedBackInfo.AcceptAlarmTime = DateTime.Now;
feedBackInfo.AccidentType = 2;
feedBackInfo.AlarmLevel = 3;
feedBackInfo.ID = "3";
this.currentInfo = "";
currentInfo = alarmInfo.ID;
currentInfo = currentInfo + alarmInfo.AlarmPerson;
currentInfo = currentInfo + alarmInfo.AlarmAddress;
return feedBackInfo;
}
currentInfo = alarmInfo.ID;
currentInfo = currentInfo + alarmInfo.AlarmPerson;
currentInfo = currentInfo + alarmInfo.AlarmAddress;
return feedBackInfo;
}
/// <summary>
/// 递归复杂数据
/// </summary>
/// <param name="spectator"></param>
/// <returns></returns>
public void Alarm3(Spectator spectator)
{
spectator = spectator;
this.currentInfo = "";
currentInfo = spectator.ID;
currentInfo =currentInfo+ spectator.AlarmPerson;
currentInfo = currentInfo + spectator.AlarmAddress;
currentInfo = currentInfo + spectator.AlarmInfo1.AlarmPerson;
}
/// 递归复杂数据
/// </summary>
/// <param name="spectator"></param>
/// <returns></returns>
public void Alarm3(Spectator spectator)
{
spectator = spectator;
this.currentInfo = "";
currentInfo = spectator.ID;
currentInfo =currentInfo+ spectator.AlarmPerson;
currentInfo = currentInfo + spectator.AlarmAddress;
currentInfo = currentInfo + spectator.AlarmInfo1.AlarmPerson;
}
/// <summary>
/// 大数据量参数
/// </summary>
/// <param name="extentName">二进制文件</param>
/// <param name="extentName">附件扩展名</param>
public void AlarmAffix(byte[] file, string extentName)
{
string AffixPath = System.Environment.CurrentDirectory + " //text." + extentName;
File.WriteAllBytes(AffixPath, file);
}
/// 大数据量参数
/// </summary>
/// <param name="extentName">二进制文件</param>
/// <param name="extentName">附件扩展名</param>
public void AlarmAffix(byte[] file, string extentName)
{
string AffixPath = System.Environment.CurrentDirectory + " //text." + extentName;
File.WriteAllBytes(AffixPath, file);
}
/// <summary>
/// 客户端向服务端订阅服务
/// </summary>
/// <param name="id"></param>
public void Subscribe(Guid id)
{
if (!list_SubscrberId.Contains(id))
{
list_SubscrberId.Add(id);
//注意,此处ICallbackEvents定义在服务契约中,在“[ServiceContract(CallbackContract=typeof(ICallbackEvents))]”
//添加了对此契约的引用。
ICallbackEvents callback = OperationContext.Current.GetCallbackChannel<ICallbackEvents>();
list_Callback.Add(callback);
}
}
/// 客户端向服务端订阅服务
/// </summary>
/// <param name="id"></param>
public void Subscribe(Guid id)
{
if (!list_SubscrberId.Contains(id))
{
list_SubscrberId.Add(id);
//注意,此处ICallbackEvents定义在服务契约中,在“[ServiceContract(CallbackContract=typeof(ICallbackEvents))]”
//添加了对此契约的引用。
ICallbackEvents callback = OperationContext.Current.GetCallbackChannel<ICallbackEvents>();
list_Callback.Add(callback);
}
}
/// <summary>
/// 撤销指定客户端订阅的服务
/// </summary>
/// <param name="id"></param>
public void UnSubscribe(Guid id)
{
list_Callback.RemoveAt(list_SubscrberId.IndexOf(id));
list_SubscrberId.Remove(id);
/// 撤销指定客户端订阅的服务
/// </summary>
/// <param name="id"></param>
public void UnSubscribe(Guid id)
{
list_Callback.RemoveAt(list_SubscrberId.IndexOf(id));
list_SubscrberId.Remove(id);
}
同时提供一个实例下载的地址
http://download.csdn.net/source/3250351
http://download.csdn.net/source/3250351