Wpf服务器/客户端登录。事件的问题

时间:2012-04-10 07:24:50

标签: c# wpf wcf event-handling

我对编程很新,所以如果我的问题不够具体,请耐心等待。现在我正在尝试对我的服务器进行简单的客户端登录。因此,服务器App知道哪些用户已连接。当客户端连接时,我希望在更新用户列表的服务器上触发事件。但它没有,我无法弄清楚为什么。希望你能帮忙。

在代码中,我删除了如何在serverApp中显示用户。现在我只需要活动就可以了。

在我的服务库中:

INetworkService合同:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace NetworkLib
{
    [ServiceContract]
    public interface INetworkService
    {
        [OperationContract]
        void Logon(UserInfo userInfo);

        [OperationContract]
        void Logout();
    }
}

NetworkService类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace NetworkLib
{
    public class NetworkService : INetworkService
    {
        public event EventHandler UserListChanged;

        public void Logon(UserInfo userInfo)
        {
            OnUserListChanged();
        }

        public void Logout()
        {
            OnUserListChanged();
        }

        private void OnUserListChanged()
        {
            var handler = UserListChanged;
            if (handler != null)
            {
                handler(this, EventArgs.Empty);
            }
        }
    }
}

UserInfo类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;

namespace NetworkLib
{
    [DataContract]
    public class UserInfo
    {
        [DataMember]
        public string Name;
    }
}

在我的ServerApp(WPF)中:

using System.ServiceModel;
using NetworkLib;

namespace ServerApp
{
    public partial class MainWindow : Window
    {

        NetworkService networkService;

        public MainWindow()
        {
            InitializeComponent();

            ServiceHost host = new ServiceHost(typeof(NetworkService));

            host.Open();

            networkService = new NetworkService();

            networkService.UserListChanged += networkService_UserListChanged;

        }

        private void networkService_UserListChanged(object sender, EventArgs e)
        {
            MessageBox.Show("It Works!");
        }
    }
}

在我的ClientApp(WPF)中:(已对服务器进行了服务引用)

namespace ClientApp
{

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            ServiceReference.NetworkServiceClient proxy = new ServiceReference.NetworkServiceClient();

            ServiceReference.UserInfo userInfo = new ServiceReference.UserInfo();

            userInfo.Name = "Test";

            proxy.Logon(userInfo);

        }
    }
}

4 个答案:

答案 0 :(得分:3)

您订阅了除ServiceHost实例化之外的其他NetworkService实例的事件。在您每次向服务器发出请求时,都会创建新的NetworkService实例。将以下属性放在NetworkService类上面:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

然后订阅活动:

var serviceInstance = (NetworkService)host.SingletonInstance;
serviceInstance.UserListChanged += networkService_UserListChanged;

答案 1 :(得分:2)

创建ServiceHost时,您应该提供NetworkService实例而不是typeof(NetworkService)

ServiceHost host = new ServiceHost(networkService);

当然,您需要先将其初始化。

答案 2 :(得分:0)

我没有仔细查看,但总的来说你的代码看起来还不错。在这种情况下,运行2个VisualStudio实例有时很有用 - 一个用于调试中的服务器,另一个用于调试中的客户端。如果你在调试客户端的VS中的客户端button1_Click代码中设置了一个断点,并且在调试服务器的VS中的NetworkServices.Logout中有一个断点,那么你将能够从客户端到服务器代码,并且很容易看到哪里出错了。

答案 3 :(得分:0)

为什么你需要一个活动模型?为什么不直接在NetworkService.Logout()中处理您的“事件”。是否将此事件推送到事件然后必须连接该事件(正如ilya.dofofeev正确指出的那样不是在同一个对象上)会提供任何真正的好处吗?