0

次のコードがあります...

DiscoveryService.cs

[ServiceContract]
public interface IDiscoveryService
{
    [OperationContract]
    void PrintHello();
}

public class DiscoveryService : IDiscoveryService
{
    public void PrintHello()
    {
        MessageBox.Show("Hello");
    }
}

サーバー.cs

    private void InitializeDiscovery()
    {
        Uri baseAddress = DiscoveryHelper.AvailableTcpBaseAddress;
        ServiceHost host = new ServiceHost(typeof (DiscoveryService), baseAddress);
        host.EnableDiscovery();
        host.Open();
    }

Client.cs

    private void DiscoverAddressClick(object sender, EventArgs e)
    {
        EndpointAddress address =  DiscoveryHelper.DiscoverAddress<IDiscoveryService>();
        Binding binding = new NetTcpBinding();

        IDiscoveryService proxy = ChannelFactory<IDiscoveryService>.CreateChannel(binding, address);
        proxy.PrintHello();

        (proxy as ICommunicationObject).Close();
    }

現在、このコードは、サービス コントラクトに関係するものを変更する時点まで機能しているように見えます。この時点で、TCP 例外、エラー コード 10061 (接続がアクティブに拒否されました) が発生します。ただし、誰が拒否したのか、理由はわかりません。コードを以前の状態に戻そうとすると、それが機能していたときにできません。プロジェクトに何かを追加/削除した後 (そう思われる)、単に機能しなくなります。

私が構築するたびに、最初に掃除します。また、ここに掲載されている指示に従っています。

何かご意見は?

4

2 に答える 2

0

まず、WCFディスカバリーについてはあまり詳しくないことを説明します。ただし、新しいサーバースタックに実装することもできます。しかし、ここで私が見ないことの1つは、ここに提示するものにプロキシサーバーが存在することです。

私がMSDNで読んだことから理解しているように、WCFサービスは基本的にその存在をネットワーク上で実行されているプロキシサーバーに登録します。クライアントは、DiscoveryProxyサーバーを介してサービスサーバーを「検出」します。それはあなたが欠けている配管の一部かもしれません。

于 2012-06-29T20:41:08.590 に答える
0

サーバーの現在の実装は、InitializeDiscovery メソッドが完了するとすぐにサーバーを閉じます。これは、ホストには関数スコープしかなく、参照を別の場所に保持しない限り、ガベージ コレクターによってクリーンアップされるためです。

于 2012-06-29T21:06:17.173 に答える