从客户端返回时不是同一个对象

时间:2017-03-23 09:27:18

标签: c# wcf

我想使用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);
}

2 个答案:

答案 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;
    }
}