广播到WCF应用程序中的所有客户端

时间:2015-08-17 13:00:56

标签: c# wcf

我目前正在制作一个WCF-WPF应用程序,其中多个客户端可以连接到聊天室。除了最重要的部分,我几乎在那里。每当我启动主机时,我都可以连接一个客户端,并在客户端的GUI上显示接收和发送的每条消息。但是,每当我尝试连接第二个客户端时,该客户端的程序都会因System.ServiceModel.CommunicationObjectFaultedException而崩溃。

我不知道我做错了什么,并希望这里有经验的程序员可以帮助我。进行。

这是我的WCF服务:

FileOutputStream outFile =new FileOutputStream(new File(FilePath ));
    wb.write(outFile);
    outFile.close();

我的客户端应用程序是一个WPF项目,其中包含一些已生成的组件。 xaml.cs文件如下所示:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class Service1 : IService1
{
    private static Dictionary<string, IService1Callback> clients = new Dictionary<string, IService1Callback>();

    public Service1()
    {
    }
    public void SendMessage(Message m)
    {
        Console.WriteLine("Sent by: " + m.User);
        Console.WriteLine(m.Content);
        Console.WriteLine("");
        foreach (var client in clients)
        {
            client.Value.SendMessageToClients(m);
        }
    }

    public void RegisterClient()
    {
        IService1Callback callback = OperationContext.Current.GetCallbackChannel<IService1Callback>();
        clients.Add("Client", callback);
    }
}

如果有人能帮我解决这个问题会很棒。非常感谢!

2 个答案:

答案 0 :(得分:0)

问题是由RegisterClient方法尝试使用相同的密钥(“客户端”)添加多个Dictionary条目引起的。字典中的每个条目都必须有唯一的密钥。

试试这个:

clients.Add(Guid.NewGuid().ToString(), callback);

答案 1 :(得分:0)

我建议获取当前上下文的 sessionId ,并确保在您的存储中不会注册具有相同回调的同一会话。

public void RegisterClient()
{
    IService1Callback callback = OperationContext.Current.GetCallbackChannel<IService1Callback>();
    var sessionId = OperationContext.Current.SessionId;
    if (!clients.ContainsKey(sessionId))
    {
       clients.Add(sessionId, callback);
    }
}

上述方法将为您提供一个优势,可以跟踪哪些会话与现有回调相关联,同时避免在已注册的同一用户中注册重复回调。 SessionId 对于每个连接的用户都是唯一的。 “假设您使用双工消息交换模式”