
聊天协议,需会话状态存储用户信息,开启重入防止死锁

[ServiceContract(Namespace = "szgamer",

Name = "ChatService",

SessionMode = SessionMode.Required,

ProtectionLevel = ProtectionLevel.None,

CallbackContract= typeof(IChatServiceCallback))]

public interface IChatService

{

[OperationContract(Name= "Enter",IsOneWay= true)]

void Enter( string name);

[OperationContract(Name = "Exit", IsOneWay = true)]

void Exit();

[OperationContract(Name = "BroadcastChat", IsOneWay = true)]

void BroadcastChat( string content);

[OperationContract(Name = "PrivateChat", IsOneWay = true)]

void PrivateChat( string target, string content);

}

聊天回调协议

public interface IChatServiceCallback

{

[OperationContract(Name = "BroadcastChated", IsOneWay = true)]

void BroadcastChated(User who, string content);

[OperationContract(Name = "PrivateChated", IsOneWay = true)]

void PrivateChated(User who, string content);

[OperationContract(Name = "NotifyUserList", IsOneWay = true)]

void NotifyUserList(IList<User> users);

}

用户信息体,只公开运行时标识和名字给客户端

[DataContract(Namespace = "szgamer", Name = "User")]

public class User : IExtensibleDataObject

{

[DataMember(Name = "Rtid", IsRequired = true, Order = 0)]

public string Rtid

{

get;

set;

}

[DataMember(Name = "Name", IsRequired = true, Order = 1)]

public string Name

{

get;

set;

}

public ExtensionDataObject ExtensionData

{

get;

set;

}

public IChatServiceCallback Callback

{

get;

set;

}

public User( string rtid, string name, IChatServiceCallback callback)

{

Rtid = rtid;

Name = name;

Callback = callback;

}

public override string ToString()

{

return string.Format( "{0}: {1}", Name, Rtid);

}

}