0

私はプログラミングにかなり慣れていないので、私の質問が十分に具体的でない場合はご容赦ください。現在、サーバーへの単純なクライアント ログオンを作成しようとしています。したがって、サーバー アプリは、接続しているユーザーを認識します。クライアントが接続すると、ユーザーリストを更新するイベントがサーバーで発生します。しかし、そうではなく、その理由がわかりません。お役に立てれば幸いです。

コードでは、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);
            }
        }
    }
}

ユーザー情報クラス:

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

4 に答える 4

3

ServiceHost がインスタンス化する以外の NetworkService インスタンスのイベントをサブスクライブします。あなたの場合、サーバーにリクエストするたびに、新しい NetworkService インスタンスが作成されます。次の属性を NetworkService クラスの上に配置します。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

次に、イベントにサブスクライブします。

var serviceInstance = (NetworkService)host.SingletonInstance;
serviceInstance.UserListChanged += networkService_UserListChanged;
于 2012-04-10T07:37:59.670 に答える
2

ServiceHost を作成するときは、代わりに NetworkService インスタンスを提供する必要があります。typeof(NetworkService)

ServiceHost host = new ServiceHost(networkService);

もちろん、最初に初期化する必要があります。

于 2012-04-10T07:35:48.860 に答える
0

なぜここにイベントモデルが必要なのですか?NetworkService.Logout()で「イベント」を直接処理してみませんか。これをイベントにプッシュしてから、そのイベントをワイヤリングする必要がありますか(ilya.dofofeevが正しく指摘しているように、同じオブジェクト上にない)、実際のメリットはありますか?

于 2012-04-10T07:46:16.143 に答える
0

詳細はわかりませんでしたが、全体的にコードは問題ないようです。この状況では、VisualStudio の 2 つのインスタンスを実行すると便利な場合があります。1 つはデバッグ中のサーバー用、もう 1 つはデバッグ中のクライアント用です。クライアントをデバッグする VS のクライアント button1_Click コードにブレーク ポイントを配置し、サーバーをデバッグする VS の NetworkServices.Logout にブレーク ポイントを配置すると、クライアントからサーバー コードにステップし、どこで何が問題なのかを簡単に確認できます。

于 2012-04-10T07:32:49.290 に答える