{
MessageType type = e.MessageType;
switch (type)
{
case MessageType.Enter:
_callBack.UserEnter(e.FromPerson);
_callBack.GetOnlineUser(this.GetOnlinePerson());
break;
case MessageType.PublicChat:
_callBack.ReceivePublicChatInfo(e.FromPerson, e.Chat);
break;
case MessageType.Leave:
_callBack.UserLeave(e.FromPerson);
_callBack.GetOnlineUser(this.GetOnlinePerson());
break;
case MessageType.PrivateChat:
_callBack.ReceivePrivateChatInfo(e.FromPerson, e.ToPerson, e.Chat);
break;
}
}
其中在case MessageType.Enter:中有两个回调客户端的方法UserEnter和GetOnlineUser,然后客户端这样调用:
{
PersonInfo info = new PersonInfo();
info.Age = 27;
info.Name = textBox2.Text;
info.Sex = "男";
chat.Contect(info);
}
然后启动服务调用的时候,在服务端回调的方法GetOnlineUser除报错:
The sequence has been terminated by the remote endpoint. The user of the remote endpoint's reliable session expects no more messages and a new message arrived. Due to this the reliable session cannot continue. The reliable session was faulted.
我的想法应该是这样的:
session应该是在服务端回调执行完UserEnter后session被dispose了。所以后续的GetOnlineUser执行的时候就会报上面的错误。
解决方案如下:
我在接口的connect方法上的OperationContract特性中加入IsInitiating=true
[OperationContract(IsOneWay = true,IsInitiating=true)]
void Contect(PersonInfo info);
然后在回调接口中的GetOnlineUser方法上的OperationContract特性中加入IsTerminating=true
[OperationContract(IsOneWay = true,IsTerminating=true)]
void GetOnlineUser(List<PersonInfo> list);
客户端的代码改为:
PersonInfo info = new PersonInfo();
info.Age = 27;
info.Name = textBox2.Text;
info.Sex = "男";
chat.Contect(info);
重启启动再看结果,还是报错:
The contract 'IChat' is not self-consistent -- it has one or more IsTerminating or non-IsInitiating operations, but it does not have the SessionMode property set to SessionMode.Required. The IsInitiating and IsTerminating attributes can only be used in the context of a session.
错误提示要加入SessionMode property 然后设置为 SessionMode.Required,ok,加入,
[ServiceContract(Namespace = "http://cyclonechat.com/", CallbackContract = typeof(ICallBack),SessionMode=SessionMode.Required)]
public interface IChat
再启动,Ok,大功告成!