1

私は WCF を学んでいる途中で、実践的な演習として、ServiceHost クラスの汎用ラッパーを作成することにしました。アイデアは、以下のようなクラスを持つことです:

public class Host<I(nterface), S(ervice)>
    where S : I, new()
{
    /**/

    ServiceHost mServiceHost;
    S mServiceInstance = new S();
}

ここで、I タイプは[ServiceContract]属性を持つインターフェースであり、S タイプは前述のインターフェースを実装しているサービスです。

外出先でクラスをテストするために、その間に補助的な hello-world タイプのサービスを作成しました。

ホストのコンストラクターで、次のように内部 ServiceHost をインスタンス化しました。

mServiceHost = new ServiceHost(mServiceInstance);

サービス エンドポイントを追加しました。

mServiceHost.AddServiceEndPoint(typeof(I), new BasicHttpBinding(), new Uri("http://localhost:40000/MyTestService"));

少し後、ホストを開いてアプリケーションを起動し、ブラウザが「http://localhost:40000/MyTestService」の下にサービスが存在することを示すかどうかを確認しようとしました - 空白のページが表示され、追加しようとするすべての試みサービスの参照に失敗しました。

後で同じ Uri を ServiceHost のコンストラクターに追加しました。

mServiceHost = new ServiceHost(mServiceInstance, new Uri("http://localhost:40000/MyTestService"));

そのコンストラクタの 2 番目の引数は次のいずれかです。

params string[] baseAddresses 

また

params Uri[] baseAddresses

いずれにせよ、「params」キーワードの存在は、このパラメーターがオプションであることを示しています。

アプリを再起動し、(ブラウザーを使用して) uri に移動しました。サービスページがポップアップしました。全体として、機能していますが、期待どおりではありません。何かが足りないようです。

質問:

  1. ServiceHost コンストラクターでオプションの baseAddresses パラメーターを指定しなかった場合 (サービス エンドポイントの追加時にアドレスをフィードしようとしたときに)、サービスが失敗したのはなぜですか?

  2. 「最初に望んでいた方法」で目標を達成できますか?

よろしくお願いします。WCF の専門家からの連絡をお待ちしております(tm)。

4

1 に答える 1

1

Greg Sansom が最初の質問に答えました。2 番目の方法については、Juval Lowy の ServiceModelEx クラス (特に ServiceHost) のダウンロードをご覧ください。WCF の便利なクラスがいくつか含まれています。

于 2011-01-03T23:13:37.767 に答える