WCF(2)我的第一个WCF程序,(解决方案结构、服务契约定义、服务契约定义等)
来源:互联网 发布:淘宝刷手举报有奖吗 编辑:程序博客网 时间:2024/05/01 10:20
目的
通过创建WCF客户端、服务器程序,通过实际应用以达到对WCF新知识的进一步掌握。
需求
1 客户端通过服务向服务器端报警,服务器端能接受报警信息,并且向客户端提供接警反馈信息。
2 分别使用直接调用、订阅发布两种模式实现。
3 能传输大数据量100M.
4 要提供寄宿IIs和寄宿应用程序两种服务发布方式。
需求分析
通过对上述需求的分析,整个系统的结构初步可以划分为:
1. AlarmContracts :用于系统用到的各种服务、服务所需数据类型的的约定部分。(类库对象)
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
- WCF(2)我的第一个WCF程序,(解决方案结构、服务契约定义、服务契约定义等)
- WCF 服务契约的继承
- WCF契约的简单介绍(服务契约 数据契约 消息契约)
- WCF契约的简单介绍(服务契约 数据契约 消息契约)
- WCF契约的简介(服务契约、数据契约和消息契约)
- WCF契约的简单介绍(服务契约 数据契约 消息契约)
- (2) 第二章 WCF服务与数据契约 服务契约详解(一) - 服务契约
- wcf学习笔记4 定义服务契约contract
- (2) 第二章 WCF服务与数据契约 服务契约详解(二)- 如何引用WCF提供的服务
- WCF契约设计: 服务契约,数据契约和消息契约
- WCF契约之---服务契约 、数据契约、 消息契约
- WCF定义数据契约注意事项
- WCF中服务继承多个契约的使用
- WCF编码规范(三)服务契约
- WCF 之 服务契约(Service Contract)
- WCF开发之服务契约
- WCF开发之服务契约
- WCF框架之服务契约
- Android开发环境搭建全程演示(jdk+eclipse+android sdk包含版本更新)
- shell基础一:文件安全与权限
- ECSHOP开发出现hacking attempt
- 跨服务器的复制表的方法
- Oracle约束支持3种Delete的行为
- WCF(2)我的第一个WCF程序,(解决方案结构、服务契约定义、服务契约定义等)
- JNI 头文件生成
- shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
- Unicode下字符串与整型等的格式转换【转】
- disable/enable validate/novalidate的区别
- CString、TCHAR*、char*转换
- myeclipse to eclipse
- 李迟2011年4月知识积累
- 利用Oracle的enable validate约束进行数据检查