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);
        /// <summary>
        /// 复杂参数
        /// </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>
        /// 客户端向服务端订阅服务
        /// </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);
    }
 服务对象的实现
       [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 AlarmService()
        {
            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>
        /// 复杂参数
        /// </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;
        }
        /// <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>
        /// 大数据量参数
        /// </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>
        /// 撤销指定客户端订阅的服务
        /// </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