c# WCF初学笔记(3)

1.在服务器端的IChatService接口中添加功能方法以及定义回调接口:

这里的回调接口的定义:
用于将服务端的响应回传给客户端(调用者)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace ChatServer
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IChatService”。
    
    /// <summary>
    ///服务协定:并且设置双工通道时的回调接口类型
    ///设置服务器回调:反馈给客户端
    /// </summary>
    [ServiceContract(CallbackContract =typeof(ICallBack))]
    public interface IChatService
    {
        /// <summary>
        /// 上线(注册)
        /// </summary>
        [OperationContract(IsOneWay=false)]
        void Register(MessageModule module);
        
        /// <summary>
        /// 下线(卸载)
        /// </summary>
        [OperationContract(IsOneWay=false)]
        void OffLine(MessageModule module);

        /// <summary>
        /// 点对点
        /// </summary>
        /// <param name="module"></param>
        [OperationContract(IsOneWay =false)]
        void PointToPoint(MessageModule module);
    }

    /// <summary>
    /// 回调接口:将服务器端的响应(处理)反馈给客户端
    /// </summary>
    public interface ICallBack {//通知客户端

        /// <summary>
        /// 消息通知:当用户上线、下线都需要发送通知
        /// </summary>
        /// <param name="module"></param>
        [OperationContract(IsOneWay =false)]
        void MessageNotify(MessageModule module);

        [OperationContract(IsOneWay =false)]
        void ToFriendList(List<MessageModule> list);//通过通道传递给客户端
    }
}

那么我们发现,WCF服务接口标记了[ServiceContract]特性,而每一个接口成员都标记了[OperationContract]特性,

2.[ServiceContract]特性

为了使接口成为WCF所提供的服务,必须使用[ServiceContract] 特性来修饰,换句话说,就是为了远程可以访问此对象以及所提供的方法

					[ServiceContract] 特性的一些属性
			属性												含义
	  CallbackContract						  对于双向信息交换,如果服务契约需要具有回调功能,则设置此属性
	  ConfigurationName					      该名称用来在应用程序配置文件中定位服务元素,默认为实现服务的类的名称
	  ProtectionLevel						  允许你为公开该契约的终结点指定契约绑定所需的安全级别
	  SessionMode							  允许你设定服务契约是否支持会话还是必须使用会话

For Example:

[ServiceContract(CallbackContract =typeof(ICallBack),ConfigurationName ="ChatServer.ChatService",ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign,SessionMode = SessionMode.Allowed)]

3.[OperationContract]特性

在WCF框架中使用的方法必须使用此特性来修饰。也可以使用各种属性来配置该特性

				[OperationContract] 特性的一些属性
				属性									含义
			AsyncPattern					指明操作是否使用Begin/End方法来异步执行。这能让服务把处理转到另一个服务器端线程上。
			IsInitiating					指定该操作能否作为一个会话中的初始操作
			IsOneWay					指明该操作是否只是由单个输入消息组成

详细的特性说明,附上微软官网链接:OperationContractAttribute类封装了这些特性
4.在服务器端,添加消息模型类MessageModule:用来封装需要发送的信息数据

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace ChatServer

{
    /// <summary>
    /// 希望对象以流的方式进行传输
    /// </summary>
    [Serializable]//序列化处理
    [DataContract]//数据契约
    public class MessageModule
    {
        /// <summary>
        /// 发送者Id
        /// </summary>
        [DataMember]//数据成员
        public string SenderId { get; set; }

        /// <summary>
        /// 发送者Name
        /// </summary>
        [DataMember]
        public string SenderName { get; set; }

        /// <summary>
        /// 消息内容
        /// </summary>
        [DataMember]
        public string MessageContent { get; set; }

        /// <summary>
        /// 接收者Id
        /// </summary>
        [DataMember]
        public string ReceiverId { get; set; }

        /// <summary>
        /// 消息模式:1.上线、 2.下线、3.点对点、4.点对面(广播、群聊)
        /// </summary>
        [DataMember]
        public int MessageMode { get; set; }

        /// <summary>
        /// 好友发送过来的信息是否已经读取
        /// </summary>

        [DataMember]
        public int IsRead { get; set;}
       
        /// <summary>
        /// 通道(状态):回调(在服务器端)
        ///当发送人发送信息给收信人,使用某个通道发送,保留此通道,使得收信人再通过此通道回送信息
        /// </summary>
        [DataMember]
        public ICallBack CallBack { get; set; }

        /// <summary>
        /// 消息模式(服务器端使用):使用枚举列举好友当前处于的状态
        /// </summary>
        public enum MsgMode {
            /// <summary>
            /// 上线
            /// </summary>
            Online=1,
            /// <summary>
            /// 下线
            /// </summary>
            OffLine=2,
            /// <summary>
            /// 点对点
            /// </summary>
            PointToPoint=3,
            /// <summary>
            /// 点对面
            /// </summary>
            PointToSurface=4
        }
    }
}

5.[DataContract]特性

数据契约:服务端和客户端之间要传送的自定义数据类型
一旦声明一个类型为DataContract,那么该类型被序列化后可以在服务端和客户端之间传送.。
WCF中需要在客户端和服务器端传送的自定义对象,其类型必须使用[DataContract]和[Serializable]这两个特性

	[Serializable()]//序列化处理
    [DataContract()]//数据契约
    public class MessageModule
    {
      ..........................
    }

6.[DataMember]特性

只有声明为DataContract的类型的对象可以被传送,且只有成员属性会被传递,成员方法不会被传递。WCF对声明为DataContract的类型提供更加细节的控制,可以把一个成员排除在序列化范围以外,也就是说,客户端程序不会获得被排除在外的成员的任何信息,包括定义和数据。默认情况下,所有的成员属性都被排除在外,因此需要把每一个要传送的成员声明为DataMember;

		/// <summary>
        /// 好友发送过来的信息是否已经读取
        /// </summary>
        [DataMember]
        public int IsRead { get; set;}

之前在此类中添加了一个属性,重新生成项目,但是在客户端更新引用后,怎么也获取不到新添加的属性,才发现没有给这个属性添加DataMember特性

这边需要注意一下:在服务器端添加了功能代码后,重新生成项目,然后在客户端更新服务引用,获取最新的服务

发布了86 篇原创文章 · 获赞 1 · 访问量 835

猜你喜欢

转载自blog.csdn.net/qq_34550459/article/details/104517338