我想使用WCF创建一个非常简单的聊天程序。
当有人登录时,服务器端会创建一个ChatMember对象,将其添加到列表中,并将其发送回客户端以进一步使用。 稍后客户端发送回前面提到的ChatMember对象,服务器尝试在列表中找到它,但它不能。列表仍然有一个对象,但两个对象的引用看似不同。为什么?这是正常的吗?
服务器端:
public class Service1 : IService1
{
static List<ChatMember> members = new List<ChatMember>();
public DataMember Login(string name)
{
var member = new ChatMember(name);
members.Add(member);
return member;
}
public bool Logout(DataMember member)
{
bool foundAndRemoved = members.Remove(member);
}
}
[DataContract]
public class ChatMember
{
[DataMember]
public string Name {get;set;}
... other properties which are either or not DataMembers
}
客户方:
void Stuff()
{
Service1Client client = new Service1Client();
ChatMember me = client.Login("testName");
bool retVal = client.Logout(me);
}
答案 0 :(得分:3)
通过wcf发送对象时会对其进行序列化和反序列化,因此它们实际上并不是每一侧的相同对象。最好从客户端传递ID,然后让服务器按ID查找对象。
答案 1 :(得分:1)
对象是相同的(相同名称)但每次当对象通过网络传递时,DataContractSerializer将生成一个新实例。 我会确保每个聊天成员都有一个唯一的ID,然后使用字典来保存所有聊天成员。这样,由于您使用唯一标识符,因此引用不相同也无关紧要。 Guid字符串将在客户端生成,但您也可以在服务器端执行。 然后,您将不会传输成员名称,而是传输ChatMember对象本身。这样,您还可以向ChatMember添加其他属性,例如年龄,性别或兴趣。
public class Service1 : IService1
{
private static Dictionary<string, ChatMember> members = new Dictionary<string, ChatMember>();
public ChatMember Login(ChatMember member)
{
members.Add(member.Guid, member);
return member;
}
public bool Logout(ChatMember member)
{
bool foundAndRemoved = members.Remove(member.Guid);
return foundAndRemoved;
}
}
[DataContract]
public class ChatMember
{
[DataMember]
public string Guid { get; set; }
[DataMember]
public string Name { get; set; }
public ChatMember(string name)
{
Guid = new Guid().ToString();
Name = name;
}
}