私は 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 に移動しました。サービスページがポップアップしました。全体として、機能していますが、期待どおりではありません。何かが足りないようです。
質問:
ServiceHost コンストラクターでオプションの baseAddresses パラメーターを指定しなかった場合 (サービス エンドポイントの追加時にアドレスをフィードしようとしたときに)、サービスが失敗したのはなぜですか?
「最初に望んでいた方法」で目標を達成できますか?
よろしくお願いします。WCF の専門家からの連絡をお待ちしております(tm)。