我对编程很新,所以如果我的问题不够具体,请耐心等待。现在我正在尝试对我的服务器进行简单的客户端登录。因此,服务器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);
}
}
}
答案 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正确指出的那样不是在同一个对象上)会提供任何真正的好处吗?