13

ここでは WCF の初心者です... NetTcpBinding を使用して WCF サービスを自己ホストしようとしています。MSDN の「ハウツー」チュートリアルに基づいて、すべてのバインドをコードで行い、それを WsHttpBinding から NetTcpBinding に変更したところ、次のようになりました。

var baseAddress = new Uri("net.tcp://localhost:8000/MyWebService");
var selfHost = new ServiceHost(typeof(ConcreteWebService), baseAddress);
try {
  var binding = new NetTcpBinding();
  binding.Security.Mode = SecurityMode.Message;
  selfHost.AddServiceEndpoint(typeof(IWebService), binding, "TRWebService");
  selfHost.Open();
  Console.WriteLine("The service is ready at {0}", baseAddress.AbsoluteUri);
  Console.WriteLine("Press <ENTER> to terminate service.");
  Console.WriteLine();
  Console.ReadLine();

  selfHost.Close();
} catch (CommunicationException ce) {
  Console.WriteLine("An exception occurred: {0}", ce.Message);
  selfHost.Abort();
}

つまり、チュートリアルでは、svcutil.exe を実行してクライアント用のプロキシを生成する必要があると書かれていますが、NetTcpBinding に切り替えてから、svcutil が機能しなくなり、サービスを検出できなくなりました。問題をグーグルで検索したところ、NetTcpBinding のすべての例が、コードではなく app.config ファイルでセットアップを行い、バインディング タイプが「mexTcpBinding」の「Mex」というエンドポイントがすべて追加されていることがわかりました。コードにはこれに相当するものはないようです。

では、app.config を使用するようにプロジェクトを変更し、コードベースのアプローチを放棄する必要がありますか? Mex とは何か、なぜそれが必要なのか、なぜ (明らかに) コードで呼び出すことができないのか、またはできる場合、どのように、またはなぜ推奨されないのかを説明してもらえますか? 一般に、app.config を使用するのが適しているのはいつですか? また、WCF サービスのコードを記述するのはいつですか?

4

1 に答える 1

21

使用している場合、および「企業ファイアウォールの背後にある」LAN 環境では、そうすることnetTcpBindingは間違いなく優れたアイデアです。そしてそのサービスを見つけます。mexTcpBindingsvcutil

MEX = Metadata Exchange は、WCF がサービスの外観を "公開" するために使用するメカニズムです。MEX エンドポイントがある場合、次のようなユーティリティはsvcutil、サービスをクエリして "検出" できます。たとえば、公開されているすべてのサービス メソッドや、取得する予定のパラメーターなどを調べることができます。

MEX エンドポイントを追加するには、間違いなくコードも使用できます。このフラグメントのようなもの:

var mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
selfHost.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, "mex");

MEX を使用しない場合、クライアントが適切なパラメーターを使用して適切なメソッドを確実に呼び出すことができるように、サービスが提供するサービスを消費しようとしているクライアントに何らかの方法で "伝える" 必要があります。

于 2010-12-26T16:23:05.093 に答える