【问题标题】:Broadcasting To All Clients In WCF App在 WCF 应用程序中向所有客户端广播
【发布时间】:2015-08-17 13:00:56
【问题描述】:

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

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

这是我的 WCF 服务:

[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);
    }
}

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

    public partial class MainWindow : Window
{
    Service1Client s;
    public MainWindow()
    {
        InitializeComponent();
        InstanceContext site = new InstanceContext(new CallbackHandler(txtAllMessages));
        s = new Service1Client(site);
        s.RegisterClient();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Message m = new Message();
        m.Content = txtMessage.Text;
        m.User = txtName.Text;
        s.SendMessage(m);
    }

    public class CallbackHandler : IService1Callback
    {
        public TextBox txtValue { get; set; }

        public CallbackHandler(TextBox tb)
        {
            this.txtValue = tb;
        }
        public void SendMessageToClients(Message m)
        {
            txtValue.Text += "Sent by: " + m.User + "\n";
            txtValue.Text += m.Content + "\n\n";

        }
    }
}

如果有人能够帮助我解决这个问题,那就太棒了。非常感谢!

【问题讨论】:

  • 异常中是否有消息可以提供一些线索?

标签: c# wcf


【解决方案1】:

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

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

上述方法将使您能够跟踪谁的会话与现有回调绑定,同时避免在已注册的同一用户中注册重复的回调。 SessionId 对于每个连接的用户都是唯一的。 “假设您使用的是双工消息交换模式”

【讨论】:

    【解决方案2】:

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

    试试这个:

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

    【讨论】:

    • 非常感谢! Guid.NewGuid() 本身并不代表字符串,但我添加了 .ToString() 并且它有效。我真的很感激!
    猜你喜欢
    • 2015-07-03
    • 2019-04-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 2013-08-30
    • 2016-12-02
    相关资源
    最近更新 更多