3

WCFサーバーライブラリとclient[Winform]があり、セルフホストのwinformを使用してサーバーを起動します。

クライアントがLAN上のアクティブなサーバーを検出できるようにしたいのですが、別の方法でオンラインサーバーのIPアドレスをリストに追加します。私は試しましたDiscoveryClientUdpDiscoveryEndpointそしてそれはうまくいきましたこれはコードです:

クライアント[Winform]:

 private void button1_Click(object sender, EventArgs e)
    {
        DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
        FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(IFileManager)));
        foreach (EndpointDiscoveryMetadata ep in findResponse.Endpoints)
        {
            listView1.Items.Add(ep.Address.ToString());
        }
    }   

サーバー[Winform]:

ServiceHost host = new ServiceHost(typeof(MainService));
private void button1_Click(object sender, EventArgs e)
    {
        if (button1.Text == "Start")
        {
            host.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
            host.AddServiceEndpoint(new UdpDiscoveryEndpoint());
            host.Open();
            button1.Text = "Stop";
        }
        else
        {
            host.Close();
            button1.Text = "Start";
        }
    }

しかし、それは私が期待したようには機能しませんでした!

  • ClientDiscoveryに特定の基準を指定する必要があるのはなぜですか?私は多くのインターフェースを持っています、私はインターフェースのアドレスではなく、ホストアドレスだけが必要です!
  • リストを取得するのに時間がかかりすぎる[約15〜20秒]、速いと思いませんか?

    更新:
    WCFを使用する前にTCPソケットでサーバー検出を開発しました。試行/キャッチする並列スレッドを使用して、255のIPアドレスを接続してループしました。例:(192.168.1.X)、LAN5サーバーで試行しました[ PC]、結果はとても完璧で高速でした、私はタイムアウト(3秒)を座って
    いましたが、WCFではこれをどのように達成するのかわかりません!!

    ここに画像の説明を入力してください

  • 4

    2 に答える 2

    4

    ClientDiscoveryに特定の基準を指定する必要があるのはなぜですか?私は多くのインターフェースを持っています、私はインターフェースのアドレスではなく、ホストアドレスだけが必要です!

    これがデカップリングのポイントです。必要なすべてのサービスが単一のサーバー上にあるという事実は、実装の詳細です。そうは言って、クライアントを特定のアーキテクチャに結合して、検出プロセスの最初の結果から受け取ったMEXアドレスからの情報を使用してクライアントを手動で作成することができます。

    リストを取得するのに時間がかかりすぎる[約15〜20秒]、速いと思いませんか?

    いいえ、サービスの複数のインスタンスを探している場合、検出は高速であるとは想定されていません。デフォルトのタイムアウトは20秒です。これで、そのサービスのインスタンスが1つだけ必要な場合(ほとんどの場合)、FindCriteriaのMaxResultsプロパティを1に設定することで、最初のサービスを見つけた後に明示的に停止するようにクライアントに指示できます。タイムアウトを待っています。

    詳細については、この優れた記事を確認してください。

    アップデート

    タイムアウトは、 FindCriteria.Durationプロパティを介して設定できます。

    更新2

    このサービスについて取得できるすべての情報は、MEXエンドポイントを介して取得されます。検出から取得したMEXアドレスでMetadataExchangeClientを使用し、取得したMetadataSetの情報を利用できます(http://msdn.microsoft.com/en-us/library/ms730243.aspx、サービスの取得を参照)。メタデータ)ですが、このように使用したことがないため、どのような情報が返されるかはわかりません。

    ステータスの意味によって異なります。WS-discoveryには、サービスが存在するかどうかにかかわらず、私が認識しているステータスの概念はありません。この概念の他の解釈は、サービスの操作として自分自身を実装する必要があります。

    于 2012-05-03T07:55:04.163 に答える
    4

    同期メソッドではなく、イベントでDiscoveryClient'sFindAsync()メソッドを使用すると、エンドポイントの結果が到着するとすぐにイベントが発生することがわかります。つまり、検索の終わり。発砲すると検索が終了したことがわかります。FindProgressChangedFindCompletedFind()FindProgressChangedFindCompleted

    FindProgressChanged私の場合、この方法を使用してイベントを通じてすべてのネットワークのクライアントが報告するまでに数秒もかかりません。

    ああ、なんらかの理由で検索をキャンセルする必要がある場合(たとえば、検索の途中で誰かがダイアログを閉じた場合)、DiscoveryClientCancelAsync()メソッドを呼び出します。

    于 2015-02-09T06:14:45.007 に答える