我目前正在制作一个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);
}
}
如果有人能帮我解决这个问题会很棒。非常感谢!
答案 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 对于每个连接的用户都是唯一的。 “假设您使用双工消息交换模式”